码迷,mamicode.com
首页 > 其他好文 > 详细

luogu P3932 浮游大陆的68号岛

时间:2018-10-04 08:44:03      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:printf   简单   区别   base   efi   read   就是   没有   nbsp   

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

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

每次他们会选出一个小妖精,然后剩下的人找到区间[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\n",(ansl+ansr) % mod);
54     }
55     return 0;
56 }

OK啦

luogu P3932 浮游大陆的68号岛

标签:printf   简单   区别   base   efi   read   就是   没有   nbsp   

原文地址:https://www.cnblogs.com/yuyanjiaB/p/9741076.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!