浮游大陆的68号岛

题目背景

大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg

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

岛上被浓厚的森林覆盖。

在这座边境地区不起眼的浮游岛上,建立着神秘的”兵器“管理仓库——妖精仓库。

题目描述

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

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

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

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

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

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

比如储物点ii有xx个东西,要运到储物点jj,代价为

x \times \mathrm{dist}( i , j )x×dist(i,j)

dist就是仓库间的距离。

当然啦,由于小妖精们不会算很大的数字,因此您的答案需要对19260817取模。

输入输出格式

输入格式:

 

第一行两个数表示n,mn,m

第二行n-1n1个数,第ii个数表示第ii个储物点与第i+1i+1个储物点的距离

第三行nn个数,表示每个储物点的东西个数

之后mm行每行三个数x l r

表示查询要把区间[l,r][l,r]储物点的物品全部运到储物点x的花费

 

输出格式:

 

对于每个询问输出一个数表示答案

 

输入输出样例

输入样例#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
输出样例#1:
125
72
9
0
70

说明

对于30%的数据,n , m \le 1000n,m1000

对于另外20%的数据,所有储物点间的距离都为1

对于另外20%的数据,所有储物点的物品数都为1

对于100%的数据 ,n , m \le 200000 ; a_i , b_i <= 2\cdot 10^9n,m200000;ai,bi<=2109

1 对于输入的x、l、r满足$x \leq l$

这种情况的答案$ans=(mul_{r}-mul_{l-1})-(sum_{r}-sum_{l-1})dis_i$

2 对于输入的x、l、r满足$r \leq x$

很显然这种情况的$ans=sum_{r}-sum_{l-1})dis_i-(mul_{r}-mul_{l-1})$

3 需要注意的就是$l \leq x \leq r$的这种情况

对于区间内x之前的部分,有$ans=(sum_{x-1}-sum_{l-1})dis_x-(mul_{x-1}-mul_{l-1})$

对于区间内x之后的部分,有$ans=(mul_{r}-mul_{x})-(sum_{r}-sum_{x})dis_{x}$

然后我们把两个ans加起来就是这种情况的答案

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int Mod=19260817;
 7 long long ans,s[200005],w[200005],x[200005],n,m;
 8 int main()
 9 {int i,j,l,r,p;
10 long long d;
11     cin>>n>>m;
12     for (i=1;i<=n-1;i++)
13     {
14      scanf("%lld",&d);
15      x[i+1]=x[i]+d;
16      x[i+1]%=Mod;
17     }
18     for (i=1;i<=n;i++)
19     {
20      scanf("%lld",&w[i]);
21      s[i]=s[i-1]+w[i]*x[i];
22      s[i]%=Mod;
23     }
24     for (i=1;i<=n;i++)
25     w[i]+=w[i-1],w[i]%=Mod;
26     while (m--)
27     {
28         scanf("%d%d%d",&p,&l,&r);
29         if (p<=l)
30         {
31             ans=(s[r]-s[l-1]+Mod)%Mod;
32             ans=(ans-x[p]*((w[r]-w[l-1]+Mod)%Mod)%Mod+Mod)%Mod;
33             printf("%lld\n",ans%Mod);    
34         }
35         else if (p>=r)
36         {
37             ans=x[p]*((w[r]-w[l-1]+Mod)%Mod)%Mod;
38             ans=(ans-(s[r]-s[l-1]+Mod)%Mod+Mod)%Mod;
39             printf("%lld\n",ans%Mod);
40         }
41         else 
42         {
43             ans=(s[r]-s[p]+Mod)%Mod; 
44             ans=(ans-x[p]*((w[r]-w[p]+Mod)%Mod)%Mod+Mod)%Mod;
45             ans=(ans+x[p]*((w[p]-w[l-1]+Mod)%Mod)%Mod)%Mod;
46             ans=(ans-((s[p]-s[l-1]+Mod)%Mod)%Mod+Mod)%Mod;
47             printf("%lld\n",ans%Mod);
48         }
49     }
50 }

 

posted @ 2017-10-21 20:58  Z-Y-Y-S  阅读(779)  评论(0编辑  收藏  举报