First One
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 949 Accepted Submission(s): 288
Note: In this problem, you can consider log20 as 0.
The first line contains an integer n (1≤n≤105), the number of integers in the array.
The next line contains n integers a1,a2,…,an (0≤ai≤105).
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
typedef long long ll;
using namespace std;
ll n,t,a[100005],sum[100005];
ll solve(ll L,ll R){
ll i,l,r;
ll ans=0;
r=0;l=1;
for(i=1;i<=n;i++){
if(l<i) l=i;
if(r<i-1) r=i-1;
while(l<n&&sum[l]-sum[i-1]<L) l++;
while(r+1<=n&&sum[r+1]-sum[i-1]<R) r++;
if(l>r) continue;
if(sum[r]-sum[i-1]<L || sum[r]-sum[i-1]>=R) continue;
if(sum[l]-sum[i-1]<L || sum[l]-sum[i-1]>=R) continue;
ans+=(r-l+1)*i+(l+r)*(r-l+1)/2;
}
return ans;
}
int main(int argc, char *argv[])
{
ll i;
cin>>t;
while(t--){
scanf("%lld",&n);
sum[0]=0;
for(i=1;i<=n;i++){
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
}
ll num[35];
memset(num,0,sizeof(num));
num[0]=solve(0,1);
for(i=1;i<=34;i++){
ll l=pow(2.0,(int)i-1);
ll r=pow(2.0,(int)i);
num[i]=solve(l,r);
}
ll ans=0;
for(i=1;i<=34;i++) ans+=num[i]*i;
ans+=num[0];
//for(i=0;i<=34;i++) cout<<num[i]<<" ";
printf("%lld\n",ans);
}
return 0;
}