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 }

 

posted @ 2017-03-14 18:58  boom~  阅读(109)  评论(0编辑  收藏  举报