前缀和优化。

预处理出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 }
View Code

相关文章: