【洛谷3932】浮游大陆的68号岛

 

题目:

浮游大陆的68号岛,位于浮游大陆的边境地带。平时很少有人造访。

岛上被浓厚的森林覆盖。

妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活。

换用更高尚的说法,是随时准备着为这个无药可救的世界献身。

然而孩子们的生活却总是无忧无虑的,幼体的黄金妖精们过着天真烂漫的生活,自然也无暇考虑什么拯救世界之类的重任。

有一天小妖精们又在做游戏。这个游戏是这样的。

妖精仓库的储物点可以看做在一个数轴上。每一个储物点会有一些东西,同时他们之间存在距离。

每次他们会选出一个小妖精,然后剩下的人找到区间[l,r]储物点的所有东西,清点完毕之后问她,把这个区间内所有储物点的东西运到另外一个仓库的代价是多少?

比如储物点ix个东西,要运到储物点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 }

转载于:https://www.cnblogs.com/lovely-lazy-tag-zly/p/7838987.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值