前缀和优化。
预处理出a数组0~i的和,然后每次取b[i]~i的和时取出sum[i]-sum[b[i]-1]。
1 #include<stdio.h> 2 #include<math.h> 3 #include<string.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<map> 7 #include<set> 8 #include<queue> 9 #include<stack> 10 using namespace std; 11 typedef long long ll; 12 ll f2(ll a[],ll b[],ll len) 13 { 14 ll ans=0,i,j; 15 for(i=0;i<len;i++) 16 { 17 if(i!=0) a[i]+=a[i-1]; 18 if(b[i]!=0) ans+=a[i]-a[b[i]-1]; 19 else ans+=a[i]; 20 } 21 return ans; 22 } 23 ll a[1000005],b[1000005],len; 24 int main() 25 { 26 int i; 27 while(scanf("%lld",&len)!=EOF)//len<1000000 28 { 29 for(i=0;i<len;i++) scanf("%lld",&a[i]);//-1000000000<=a[i]<=1000000000 30 for(i=0;i<len;i++) scanf("%lld",&b[i]);//0<=b[i]<=i 31 printf("%lld\n",f2(a,b,len)); 32 } 33 return 0; 34 }