HDU 5358 First One(枚举)
这道题假设依照表达式一个个来算肯定超时,下午时候想了一个O(nlogn*logn)的算法。可是t了。由于这道题卡的很紧几百个例子,必须nlogn的算法才干够ac
回到这道题,考虑log(sum(i,j))+1的特点,能够发现它的值域范围很小。在1-34之间。那么我们能够考虑枚举log(sum(i,j)+1的值。记为k,然后统计(i+j)的和就可以。
对于每个k,找到全部满足2^(k-1)<=sum(i,j)<=2^k-1的(i+j),
那么我们考虑每一个前缀i,找到这个前缀满足2^(k-1)<=sum(i,j)<=2^k-1的区间[l,r],即对于这个区间的每一个元素s(i,j),都满足上式(l<=j<=r)。
这一步枚举有一个小技巧,当我们找到前缀i的区间[l,r]之后。那么前缀i+1满足上式的区间一定不可能在前缀i的[l, r]之前。
那么我们用两个指针维护这个区间就可以,那么时间复杂度就降为了O(n*logn).
ps:下午写的n*logn*logn的代码在我电脑上跑了22000ms,ac代码在我电脑上跑了5500ms,ac代码在oj上跑了1600ms。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<ctime>
#include<map>
#include<set>
#define eps 1e-6
#define LL long long
#define pii (pair<int, int>)
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; const int maxn = 100000 + 500;
//const int INF = 0x3f3f3f3f;
LL a[maxn], s[maxn];
int n; int main() {
clock_t start = clock();
// freopen("input.txt", "r", stdin);
int T; cin >> T;
while(T--) {
scanf("%d", &n);
LL ans = 0;
for(int i = 1; i <= n; i++) {
scanf("%I64d", &a[i]);
s[i] = s[i-1] + a[i];
}
for(int k = 1; k <= 34; k++) {
int l = 1, r = 0;
LL liml = k==1 ? 0 : (1LL<<(k-1)), limr = (1LL<<k)-1;
for(int i = 1; i <= n; i++) {
l = max(i, l);
while(l<=n && s[l]-s[i-1]<liml) l++;
r = max(l-1, r);
while(r+1<=n && s[r+1]-s[i-1]>=liml && s[r+1]-s[i-1]<=limr) r++;
if(l>r) continue;
// if(k==2) cout << l << " " << r << " " << i << endl;
ans += (LL)(i+l+i+r)*(r-l+1)/2*k;
}
// if(k < 5) cout << ans << endl;
}
cout << ans << endl;
}
clock_t end = clock();
// cout << end-start << endl;
return 0;
}
HDU 5358 First One(枚举)的更多相关文章
- 2015多校第6场 HDU 5358 First One 枚举,双指针
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5358 题意:如题. 解法:观察式子发现,由于log函数的存在,使得这个函数的值域<=34,然后我 ...
- HDU 5358 尺取法+枚举
题意:给一个数列,按如下公式求和. 分析:场上做的时候,傻傻以为是线段树,也没想出题者为啥出log2,就是S(i,j) 的二进制表示的位数.只能说我做题依旧太死板,让求和就按规矩求和,多考虑一下就能发 ...
- Hdu 5358 First One (尺取法+枚举)
题目链接: Hdu 5358 First One 题目描述: 数组a有n个元素,S[i,j]定义为a[i]+a[i+1]+.....+a[j],问:这个死东西等于多少? 解题思路: 二分肯定超,这个题 ...
- hdu 5358 First One
题目链接:hdu 5358 思路不难理解,就是个尺取法而已,floor(log2X) + 1 就是求 X 的二进制表示的位数,对于题目来说这个值最多只是 30+,从这里入手开始枚举,运用尺取法可以达到 ...
- HDU 5358 多校第6场 First One
First One Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tota ...
- HDU 5358(2015多校联合训练赛第六场1006) First One (区间合并+常数优化)
pid=5358">HDU 5358 题意: 求∑i=1n∑j=in(⌊log2S(i,j)⌋+1)∗(i+j). 思路: S(i,j) < 10^10 & ...
- hdu 5358 First One 2015多校联合训练赛#6 枚举
First One Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tota ...
- HDU 5358 First One(枚举)
First One Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tota ...
- HDU 5778 abs (枚举)
abs 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5778 Description Given a number x, ask positive ...
随机推荐
- HDU 5280 Senior's Array 最大区间和
题意:给定n个数.要求必须将当中某个数改为P,求修改后最大的区间和能够为多少. 水题.枚举每一个区间.假设该区间不改动(即改动该区间以外的数),则就为该区间和,若该区间要改动,由于必须改动,所以肯定是 ...
- 具体解释Ajax技术
Ajax 可以做什么? 现在 Google Suggest 和 Google Maps 使用了 Ajax,通过 Ajax,我们能够使得client得到丰富的应用体验及交换操作,而用户不会感觉到有网页提 ...
- jQuery碎语(2) 事件
4.事件 ● 通过方法名给元素绑定事件: $('li').click(function(event){}) ● 通过bind方法给元素绑定事件: $('li') .bind('click',funct ...
- 相比xib 使用代码编排view 的一个明显的好处就是可以更好地重复使用已有代码,减少代码冗余。
相比xib 使用代码编排view 的一个明显的好处就是可以更好地重复使用已有代码,减少代码冗余.
- cocos2d-x动画加速与减速
动画是游戏的必定要素之中的一个,在整个游戏过程中,又有着加速.减速动画的需求.以塔防为样例,布塔的时候希望可以将游戏减速,布好塔后,则希望能将游戏加速:当某个怪被冰冻后,移动速度减缓,而其它怪的移动速 ...
- Unity3d-Particle System系统的学习(三)
这节课我们来实战下上几节讲的几乎所有Particle System用到的参数. 我们今天制作下图所示的粒子: 类似于带有光晕的魔法球.用到的材质也就是上节课用到的材质贴图. http://pan.ba ...
- C/C++ 读取16进制文件
1.为什么有这种需求 因为有些情况需要避免出现乱码.不管什么编码都是二进制的,这样表示为16进制就可以啦. 2.如何读取16进制文件 最近编程用这一问题,网上查了一下,感觉还是自己写吧. 16进制数据 ...
- C语言文件打开方式及说明
ANSI C规定文件打开用函数fopen,关闭为fclose. 1.调用方式通常为: FILE *fp; fp=fopen(文件名, 打开方式); 2.参数说明: 文件名: 形如"myf ...
- iOS开发-舒尔特表
周末闲来无事,看一个概念,挺有意思的,舒尔特表,网上也有很多人写过类似的Demo,本人闲来无事也写了一下,舒尔特表听起来很高大上的样子,不过本人的理解就是一个正方形的矩阵中放的各种小格子,可以是字母, ...
- maven mvn Failed during checkstyle execution
maven 命令默认强制使用checkstyle, 造成 命令运行失败 并报错: Failed during checkstyle execution 关闭checkstyle,命令如下: mvn [ ...