Hdu 5358 First One (尺取法+枚举)

题目链接:

  Hdu 5358 First One

题目描述:

  数组a有n个元素,S[i,j]定义为a[i]+a[i+1]+.....+a[j],问:这个死东西等于多少?

解题思路:

  二分肯定超,这个题目的时间卡的炒鸡严格,只有n*log(n)的复杂度才能过,n*log(n)^2都不可以的。

  只需要枚举K,并且枚举区间左端i值,计算K的贡献值,然后遍历时候计算一下常数相加即可。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 typedef long long LL;
 7 const LL maxn = 100005;
 8 LL dp[maxn][35], arr[maxn];
 9 int main ()
10 {
11     int t, n;
12     scanf ("%d", &t);
13     while (t --)
14     {
15         scanf ("%d", &n);
16         arr[0] = 0;
17         for (int i=1; i<=n; i++)
18             scanf ("%lld", &arr[i]);
19         for (int i=0; i<35; i++)
20         {
21             LL sum = 1LL<<(i+1);
22             LL num = arr[1];
23             LL p = 1;
24             for (int j=1; j<=n; j++)
25             {
26                 num -= arr[j-1];
27                 while (num<sum && p<=n)
28                     num += arr[++p];
29                 dp[j][i] = p;//S[j,p]<2^i
30             }
31         }
32         LL ans = 0, res;
33         for (int i=1; i<=n; i++)
34         {
35             LL p = i, q;
36             for (int j=0; j<35; j++)
37             {
38                 q = dp[i][j];
39                 res = (j+1)*(i*(q-p) + (q+p-1)*(q-p)/2);
40                 ans += res;
41                 p = q;
42             }
43         }
44         printf ("%lld\n", ans);
45     }
46     return 0;
47 }
时间: 2024-10-07 12:57:53

Hdu 5358 First One (尺取法+枚举)的相关文章

hdu 5358 First One (尺取法)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5358 题意: 分析:首先要知道[log2(x)]+1代表x的位数,而且根据题意不会超过35,那么枚举位数i:1~35.对于每一位i找到区间[x,y],使得S(x,y)的二进制表示的位数等于i,此时的贡献为i*(x+y).那么对于每一个i,怎么找出所有符合条件的区间[x,y]?1~n枚举起点x,那么y会在一段范围[l,r]内满足条件.下次x变成x+1,即起点x向右移位,那么现在要找的y的区间为[l',r'

HDU 6103 Kirinriki(尺取法)

http://acm.hdu.edu.cn/showproblem.php?pid=6103 题意: 给出一个字符串,在其中找两串互不重叠的子串,计算它们之间的dis值,要求dis值小于等于m,求能选的子串的最大长度. 思路: 由于这两个子串是互不重叠的,那么这两个子串之间的间隔可以是奇数也可以是偶数,针对这两种情况我们枚举中心点,然后尺取法处理,具体看代码就懂了. 1 #include<iostream> 2 #include<algorithm> 3 #include<c

尺取法 枚举区间

A - 炒鸡想减肥的字符串 Time Limit:1000MS    Memory Limit:65535KB    64bit IO Format: SubmitStatusPracticeNBUT 1576 Description 从前,有一串很长很长的字符串,它由n个小写字母组成. 有一天它在照镜子的时候,觉得自己太肥了,于是它想减肥.减肥的时候,可以不断地去掉第一个或者最后一个字符. 它希望自己减肥之后,对于必须保持苗条系数M,苗条系数即必须包含'a','b','c'-- 'a'+M-1

poj 2100 尺取法 一个数字拆成连续数字平方和

题意:将一个数拆成若干个连续数字的平方和. 用尺取法枚举区间,复杂度为O(n),时限10s,3s多ac. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cmath> 5 using namespace std; 6 7 const int N = 100; 8 9 struct Node 10 { 11 int from, to; 12 } node[N]

HDU 6103 Kirinriki 枚举长度 尺取法

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6103 题目描述: 定义两个相同长度的字符串的值为首尾开始字符串的ASCII相减, 求一个字符串中任取两个相同长度的不重叠的值不超过m的最大长度 解题思路: 求连续区间不超过某一个上限或者不低于某个下限的应该用尺取法 ,复杂度为O(n),  本题n是5000所以O(n^2)可行, 枚举前缀和后缀(通过枚举前缀, 再将字符串翻转枚举前缀进行), 再进行尺取 代码:  代码中有注释 #include <

HDU 5358 First One 数学+尺取法

多校的题,摆明了数学题,但是没想出来,蠢爆了,之前算了半天的s[i][j]的和,其实是积.其实比赛的时候我连log(s[i][j])+1是s[i][j]的位数都没看出来,说出来都丢人. 知道了这个之后,就枚举二进制数的每一位,因为元素都是非负数,所以sum数组是非降的,这里用到了尺取法,之前也是听说过,应该是做过吧,不太记得了. 因为[2k-1,2k)的位数是k,枚举时,固定左端点,在sum数组找到最小的大于等于2k-1,最大的小于2k的点,这中间的点和左端点的s[i][j]就对于当前的k满足条

hdu 5371 Hotaru&#39;s problem(manacher+尺取法)

题意: 给定一个有n个数字的序列,找出一个连续的子序列满足这样的条件: 1. 平均分成三段 2. 第一段与第三段一样 3. 第二段是第一段的倒序.求这样的子序列的最大长度. 数据范围:n~100000 解析: 我看网络上面很多的题解都是用O(n2/32)的做法水数据过去的,这种做法是先用mancher算法预处理出每个每个回文串最远所能抵达的位置,然后枚举每个位置i,再枚举其回文串的长度,然后枚举当前位置i到回文串所能抵达的最远距离,判断途径的位置j是,否有回文串能够到当前位置i.但是这种做法的复

HDU 6119 小小粉丝度度熊 【预处理+尺取法】(2017&quot;百度之星&quot;程序设计大赛 - 初赛(B))

小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1572    Accepted Submission(s): 513 Problem Description 度度熊喜欢着喵哈哈村的大明星--星星小姐. 为什么度度熊会喜欢星星小姐呢? 首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听. 但这都不是最重要的,最重要的是

HDU 5672 String 尺取法追赶法

String Problem Description There is a string S.S only contain lower case English character.(10≤length(S)≤1,000,000)How many substrings there are that contain at least k(1≤k≤26) distinct characters? Input There are multiple test cases. The first line