hdu5358 First One
来源:互联网 发布:软件脱壳 编辑:程序博客网 时间:2024/04/30 10:20
Problem Description
soda has an integer array a1,a2,…,an . Let S(i,j) be the sum of ai,ai+1,…,aj . Now soda wants to know the value below:∑i=1n∑j=in(⌊log2S(i,j)⌋+1)×(i+j)
Note: In this problem, you can considerlog20 as 0.
Note: In this problem, you can consider
Input
There are multiple test cases. The first line of input contains an integer T , indicating the number of test cases. For each test case:
The first line contains an integern (1≤n≤105) , the number of integers in the array.
The next line containsn integers a1,a2,…,an (0≤ai≤105) .
The first line contains an integer
The next line contains
Output
For each test case, output the value.
Sample Input
121 1
Sample Output
12
这题题意容易懂,就是求和,其中(⌊log2S(i,j)⌋+1)的意思就是S(i,j)化成二进制后的比特位个数,因为S(i,j)不超过10^10,所以比特位不会超过35个。我们可以先初始化b[],
记录比特位为i的所有数中的最后一个数2^i-1,用sum[i]把从1到i的总和记录下来,然后用35个指针pt[i]记录以i为起点的最大下标k满足sum[k]-sum[i-1]<=b[j]。
最后注意要用G++交,C++会超时。。
#include<iostream>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<vector>#include<map>#include<set>#include<queue>#include<stack>#include<string>#include<algorithm>using namespace std;#define ll long long#define maxn 100060ll b[50],sum[maxn];//b[1]=2^i-1ll a[maxn];int pt[44];//指针void init(){int i,j;b[0]=-1;b[1]=1;for(i=2;i<=35;i++){b[i]=(1LL<<i)-1; //也可以是b[i]=((ll)1<<i)-1;,但不加的话会爆int }}int main(){int n,m,i,j,T,len;ll ans;init();scanf("%d",&T);while(T--){scanf("%d",&n);sum[0]=0;ans=0;for(i=1;i<=n;i++){scanf("%lld",&a[i]);sum[i]=sum[i-1]+a[i];}for(i=1;i<=35;i++)pt[i]=0;for(i=1;i<=n;i++){pt[0]=i-1;for(j=1;j<=34;j++){while(sum[pt[j]+1]-sum[i-1]<=b[j] && pt[j]<n){//如果a>b,那么pt[a]一定大于等于pt[b] pt[j]++;}//if(sum[pt[j]]-sum[i-1]>b[j-1] && sum[pt[j]]-sum[i-1]<=b[j] && pt[j]>=i ){ 这一句可以不用写 len=(pt[j]-pt[j-1]);ans+=(ll)j*len*i;ans+=(ll)j*len*(pt[j-1]+1+pt[j])/2;//}}}printf("%lld\n",ans);}return 0;}
0 0
- hdu5358 First One
- HDU5358-First One
- hdu5358--First One(双指针)
- hdu5358 First One 尺取法 多校联合第六场
- [区间合并,优化] hdu5358多校联合 第六场 First one
- hdu5358
- hdu5358
- hdu5358
- first one
- First One
- FIRST ONE
- first one
- First One
- First one
- first one
- First one
- First one!
- first one
- HDU 1198 Farm Irrigation(DFS)
- 二叉搜索树的基本操作(查找、插入、删除)【数据结构】
- java中classpath的详解
- HDU 5366-The mook jong(组合数学)
- 如何使用qq截图
- hdu5358 First One
- Java io文件操作(按字符、字节、行、随机读取,追加,文件操作)
- centos6.5 32位搭建hadoop2.2.0 集群
- UVA 152 Tree's a Crowd
- php框架laravel学习 二 (数据库建立迁移与建模)
- java synchronized静态同步方法与非静态同步方法,同步语句块
- 通过SQLServer的数据库邮件来发送邮件
- HDU4565 So Easy!(数学+矩阵快速幂)
- Java查看List扩容后的容量