B.储物点的距离

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述


 一个数轴,每一个储物点会有一些东西,同时它们之间存在距离。
每次给个区间[l,r],查询把这个区间内所有储物点的东西运到另外一个储物点的代价是多少?
比如储物点i有x个东西,要运到储物点j,代价为x * dist( i , j )
dist就是储物点间的距离。 


输入描述:

第一行两个数表示n,m

第二行n-1个数,第i个数表示第i个储物点与第i+1个储物点的距离ai

第三行n个数,表示每个储物点的东西个数bi

之后m行每行三个数x l r

表示查询要把区间[l,r]储物点的物品全部运到储物点x的花费
每次查询独立

输出描述:

对于每个询问输出一个数表示答案
答案对1000000007取模
示例1

输入

5 5
2 3 4 5
1 2 3 4 5
1 1 5
3 1 5
2 3 3
3 3 3
1 5 5

输出

125
72
9
0
70

备注:

对于100%的数据n,m <= 200000 , 0 <= ai,bi <= 2000000000

 

 1 #include<stdio.h>
 2 #define mod 1000000007
 3 long long a[300000],d[300000],A[300000],D[300000];
 4 int main()
 5 {
 6     long long N,M;
 7     scanf("%lld%lld",&N,&M);
 8     for(int i=2;i<=N;i++)
 9     {scanf("%lld",&d[i]);d[i]=(d[i]+d[i-1])%mod;}
10     for(int i=1;i<=N;i++)
11     {
12         scanf("%lld",&a[i]);
13         A[i]=(a[i]+A[i-1])%mod;
14         D[i]=(a[i]%mod*d[i]%mod+D[i-1])%mod;
15     }
16     long long x,l,r;
17     while(M--)
18     {
19         scanf("%lld%lld%lld",&x,&l,&r);
20         long long ans,ans1;
21         if(x<=l) ans=(D[r]-D[l-1]+mod)%mod-d[x]*(A[r]-A[l-1]+mod)%mod;
22         else if(x>=r) 
23         {
24             ans=d[x]*(A[r]-A[l-1]+mod)%mod-(D[r]-D[l-1]+mod)%mod;
25         }
26         else
27         {
28             ans=d[x]*(A[x]-A[l-1]+mod)%mod-(D[x]-D[l-1]%mod)%mod;
29             ans1=(D[r]-D[x-1]+mod)%mod-d[x]*(A[r]-A[x-1]%mod)%mod;
30             //if(ans1<0) ans1=-ans1;
31             //if(ans<0) ans=-ans;
32             ans=(ans1+ans)%mod;
33         }
34         printf("%lld\n",(ans+mod)%mod);
35     }
36     return 0;
37 }
View Code

 

 

posted @ 2017-12-19 22:33  ACRykl  阅读(262)  评论(0编辑  收藏  举报