题目:
浮游大陆的68号岛,位于浮游大陆的边境地带。平时很少有人造访。
岛上被浓厚的森林覆盖。
妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活。
换用更高尚的说法,是随时准备着为这个无药可救的世界献身。
然而孩子们的生活却总是无忧无虑的,幼体的黄金妖精们过着天真烂漫的生活,自然也无暇考虑什么拯救世界之类的重任。
有一天小妖精们又在做游戏。这个游戏是这样的。
妖精仓库的储物点可以看做在一个数轴上。每一个储物点会有一些东西,同时他们之间存在距离。
每次他们会选出一个小妖精,然后剩下的人找到区间[l,r]储物点的所有东西,清点完毕之后问她,把这个区间内所有储物点的东西运到另外一个仓库的代价是多少?
比如储物点i有x个东西,要运到储物点j,代价为:
x*dist(i,j)
dist就是仓库间的距离。
当然啦,由于小妖精们不会算很大的数字,因此您的答案需要对19260817取模。
输入格式:
第一行两个数表示n,m
第二行n-1个数,第i个数表示第i个储物点与第i+1个储物点的距离
第三行n个数,表示每个储物点的东西个数
之后m行每行三个数 x
l r
表示查询要把区间[l,r]储物点的物品全部运到储物点x的花费
输出格式:
对于每个询问输出一个数表示答案
本题两个坑点:1.前缀和的时候要每步取模
2.减法取模是:(a-b)%p=(a%p-b%p+p)%p
总体思路很简单,把求和式拆开,发现能预处理,再通过前缀和相减维护区间和就可以了
1 #include<bits/stdc++.h> 2 #define maxn 200005 3 #define mod 19260817 4 using namespace std; 5 typedef unsigned long long ll; 6 template<typename T> 7 inline void read(T &x) { 8 char ch; while((ch = getchar()), (ch < '0' || ch > '9')); 9 x = ch - '0'; while((ch = getchar()), (ch >= '0' && ch <= '9')) x = x * 10 + (ch - '0'); 10 } 11 ll p[maxn],w[maxn],wp[maxn],dw[maxn],dwp[maxn]; 12 inline ll qw(int l,int r){ 13 return (dw[r]%mod-dw[l-1]%mod+mod)%mod; 14 } 15 inline ll qwp(int l,int r){ 16 return (dwp[r]%mod-dwp[l-1]%mod+mod)%mod; 17 } 18 int main(){ 19 register int n,m,i,j,x,l,r; 20 register ll ans1=0,ans2=0,ans=0; 21 read(n),read(m); 22 for(i=2;i<=n;++i) read(p[i]),p[i]=(p[i]%mod+p[i-1])%mod; 23 for(i=1;i<=n;++i) read(w[i]),wp[i]=w[i]*p[i]; 24 for(i=1;i<=n;++i) ans1=(ans1+w[i])%mod,ans2=(ans2+wp[i])%mod,dw[i]=ans1,dwp[i]=ans2; 25 for(i=0;i<m;++i){ 26 read(x),read(l),read(r); 27 if(x>l&&x<r){ans=((p[x]*(qw(l,x-1)-qw(x+1,r)+mod)%mod)%mod+(qwp(x+1,r)-qwp(l,x-1)+mod)%mod)%mod,printf("%lld\n",ans);continue;} 28 if(x<=l){ans=(qwp(l,r)-qw(l,r)*p[x]%mod+mod)%mod,printf("%lld\n",ans);continue;} 29 if(x>=r){ans=(qw(l,r)*p[x]%mod-qwp(l,r)+mod)%mod,printf("%lld\n",ans);continue;} 30 } 31 return 0; 32 }