B.储物点的距离

Posted ACRykl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

 










以上是关于B.储物点的距离的主要内容,如果未能解决你的问题,请参考以下文章

每日一题30.储物点的距离 (区间处理,前缀和/线段树//树状数组)

P3932 浮游大陆的68号岛

luogu P3932 浮游大陆的68号岛

洛谷 P3932 浮游大陆的68号岛 题解

洛谷10月月赛R2·浴谷八连测R3 -Chtholly-T1

(译)计算距离方位和更多经纬度之间的点