luogu P3932 浮游大陆的68号岛
Posted yuyanjiab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu P3932 浮游大陆的68号岛相关的知识,希望对你有一定的参考价值。
有一天小妖精们又在做游戏。这个游戏是这样的。
妖精仓库的储物点可以看做在一个数轴上。每一个储物点会有一些东西,同时他们之间存在距离。
每次他们会选出一个小妖精,然后剩下的人找到区间[l,r]储物点的所有东西,清点完毕之后问她,把这个区间内所有储物点的东西运到另外一个仓库的代价是多少?
比如储物点i有x个东西,要运到储物点jj,代价为 x*dist(i,j)
dist就是仓库间的距离。
当然啦,由于小妖精们不会算很大的数字,因此您的答案需要对19260817取模
输入输出格式
输入格式:
第一行两个数表示n,m
第二行n-1个数,第ii个数表示第ii个储物点与第i+1个储物点的距离
第三行n个数,表示每个储物点的东西个数
之后m行每行三个数x l r
表示查询要把区间[l,r]储物点的物品全部运到储物点x的花费
输出格式:
对于每个询问输出一个数表示答案
【分析】
关于今天考试找了个题练练手……
没想到比考试还简单 连个修改都没有
和考试那个题的区别在于多了相邻点之间的距离dist
推一下每个询问的答案
就是 ∑(i=l~r)a[i] * abs(d[i]-d[x])
化简一下就是 abs(∑(i=l~r)(a[i]*d[x]) - ∑(i=l~r)(a[i]*d[i]))
然后a[i]*d[i]可以预处理出来区间和 正负也显然分成x左右就解决了
总之还是比较简单的
(如果带修改树状数组维护一下?)
Code:
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<algorithm> 5 #define rep(i,a,n) for(int i = a;i <= n;i++) 6 #define per(i,n,a) for(int i = n;i >= a;i--) 7 #define inf 2147483647 8 using namespace std; 9 typedef long long ll; 10 ll read() { 11 ll as = 0,fu = 1; 12 char c = getchar(); 13 while(c < ‘0‘ || c > ‘9‘) { 14 if(c == ‘-‘) fu = -1; 15 c = getchar(); 16 } 17 while(c >= ‘0‘ && c <= ‘9‘) { 18 as = as * 10 + c - ‘0‘; 19 c = getchar(); 20 } 21 return as * fu; 22 } 23 const int mod = 19260817; 24 const int N = 200006; 25 //head 26 ll n,m; 27 ll a[N],d[N]; 28 ll sa[N],mlt[N]; 29 ll calc(int l,int r,int x,bool op) { 30 if(l > r) return 0; 31 ll tmp1 = (sa[r] - sa[l-1]) % mod + mod; 32 tmp1 = tmp1 * d[x] % mod; 33 ll tmp2 = (mlt[r] - mlt[l-1]) % mod + mod; 34 if(op) swap(tmp1,tmp2); 35 return ((tmp1-tmp2)%mod+mod)%mod; 36 } 37 38 int main() { 39 n = read(); 40 m = read(); 41 rep(i,2,n) { 42 d[i] = (d[i-1] + read()) % mod; 43 } 44 rep(i,1,n) { 45 a[i] = read() % mod; 46 sa[i] = (sa[i-1] + a[i]) % mod; 47 mlt[i] = (mlt[i-1] + a[i] * d[i]) % mod; 48 } 49 rep(i,1,m) { 50 int x = read(),l = read(),r = read(); 51 ll ansl = calc(l,min(x-1,r),x,0); 52 ll ansr = calc(max(l,x+1),r,x,1); 53 printf("%lld ",(ansl+ansr) % mod); 54 } 55 return 0; 56 }
OK啦
以上是关于luogu P3932 浮游大陆的68号岛的主要内容,如果未能解决你的问题,请参考以下文章