HDU 5358
1 //用C++交会超时,用G++ 2 #include <cstdio> 3 #include <iostream> 4 using namespace std; 5 #define ll __int64 6 const int maxn=100005; 7 ll l[35],r[35],sum[maxn]; 8 int main() 9 { 10 l[0]=0;r[0]=1; 11 for(int i=1;i<34;i++) 12 { 13 l[i]=(1ll<<i); 14 r[i]=((1ll<<(i+1))-1); 15 } 16 int t; 17 scanf("%d",&t); 18 while(t--) 19 { 20 int n,x; 21 scanf("%d",&n); 22 for(int i=1;i<=n;i++) 23 { 24 scanf("%d",&x); 25 sum[i]=sum[i-1]+x; 26 } 27 ll ans=0; 28 for(int i=1;i<35;i++) 29 { 30 if(sum[n]<l[i-1]) 31 break; 32 ll a=1,b=0,num=0; 33 for(int j=1;j<=n;j++) 34 { 35 a=(a>j ? a : j); 36 while(a<=n&&sum[a]-sum[j-1]<l[i-1]) 37 a++; 38 b=(b>a-1 ? b : a-1); 39 while(b+1<=n&&sum[b+1]-sum[j-1]<=r[i-1]) 40 b++; 41 if(b>=a) 42 num+=(b-a+1)*j+(a+b)*(b-a+1)/2; 43 } 44 ans+=num*i; 45 } 46 printf("%I64d\n",ans); 47 } 48 return 0; 49 }