P3932 浮游大陆的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的花费

输出格式:

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

对于输入的距离,我们可以通过前缀和求出每个点的具体位置。

这样我们就可以知道任意两个点的距离了。

然后发现这道题没有修改操作,(好吧其实也没什么用。。。)

查询的话,推个式子就好了。

\[ans_{l,r}=\sum_{i=l}^ra(i)*abs(dis(i)-dis(x))
\]

一开始的时候,我是这么推得,(错的。)

\[ans_{l,r}=\sum_{i=l}^ra(i)*abs(dis(i)-dis(x))
\\=abs(\sum_{i=l}^ra(i)*dis(i)-\sum_{i=l}^ra(i)*dis[x])
\]

显然,对于abs的处理是错误的。

那么思博了一下,发现自己想的简单了,需要分情况讨论。

所以可以得出三个式子:

一、 x<l 时

\[ans_{l,r}=\sum_{i=l}^ra(i)*(dis(i)-dis(x))
\\=\sum_{i=l}^ra(i)*dis(i)-dis(x)*\sum_{i=l}^ra(i)
\]

二、\(x>r\)时

\[ans_{l,r}=\sum_{i=l}^ra(i)*(dis(x)-dis(i))
\\=dis(x)*\sum_{i=l}^ra(i)-\sum_{i=l}^ra(i)*dis(i)
\]

三、\(l\leq x\leq r\)时

\[ans_{l,r}=dis(x)*\sum_{i=l}^{x-1}a(i)-\sum_{i=l}^{x-1}a(i)*dis(i)+\sum_{i=x+1}^ra(i)*dis(i)-dis(x)*\sum_{i=x+1}^ra(i)
\]

就可以发现\(\sum\)里面只有\(a(i)\)和\(a(i)*dis(i)\),那么直接线段树维护套上式子就可以了。

另外,难得思博。。。

  1. #include<iostream>
  2. #include<cstdio>
  3. #define ls(o) o<<1
  4. #define rs(o) o<<1|1
  5. #define int long long
  6. using namespace std;
  7. const int wx=1000017;
  8. const int mod=19260817;
  9. inline int read(){
  10. int sum=0,f=1;char ch=getchar();
  11. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  12. while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0';ch=getchar();}
  13. return sum*f;
  14. }
  15. struct val_tree{
  16. int l,r,sum1,sum2,tag;
  17. #define sum1(o) t[o].sum1
  18. #define sum2(o) t[o].sum2
  19. #define tag(o) t[o].tag
  20. }t[wx*4];
  21. int a[wx];
  22. int dis[wx],w[wx];
  23. int n,m;
  24. int Abs(int a){
  25. if(a<0)return -a;
  26. return a;
  27. }
  28. void up(int o){
  29. sum1(o)=(sum1(ls(o))+sum1(rs(o)))%mod;
  30. sum2(o)=(sum2(ls(o))+sum2(rs(o)))%mod;
  31. }
  32. void build(int o,int l,int r){
  33. t[o].l=l;t[o].r=r;
  34. if(l==r){sum1(o)=a[l]%mod;sum2(o)=(a[l]%mod*w[l]%mod)%mod;return;}
  35. int mid=t[o].l+t[o].r>>1;
  36. if(l<=mid)build(ls(o),l,mid);
  37. if(r>mid)build(rs(o),mid+1,r);
  38. up(o);
  39. // printf("%d %d %d %d\n",t[o].l,t[o].r,sum1(o),sum2(o));
  40. }
  41. int query_a(int o,int l,int r){
  42. if(l<=t[o].l&&t[o].r<=r){
  43. return sum1(o)%mod;
  44. }
  45. int mid=t[o].l+t[o].r>>1;
  46. int sum=0;
  47. if(l<=mid)sum+=query_a(ls(o),l,r),sum%=mod;
  48. if(r>mid)sum+=query_a(rs(o),l,r),sum%=mod;
  49. return sum%mod;
  50. }
  51. int query_b(int o,int l,int r){
  52. if(l<=t[o].l&&t[o].r<=r){
  53. return sum2(o)%mod;
  54. }
  55. int mid=t[o].l+t[o].r>>1;
  56. int sum=0;
  57. if(l<=mid)sum+=query_b(ls(o),l,r),sum%=mod;
  58. if(r>mid)sum+=query_b(rs(o),l,r),sum%=mod;
  59. return sum%mod;
  60. }
  61. signed main(){
  62. // freopen("001.in","r",stdin);
  63. n=read();m=read();
  64. for(int i=1;i<n;i++)dis[i]=read();
  65. w[1]=1;
  66. for(int i=2;i<=n;i++)w[i]=w[i-1]+dis[i-1];
  67. for(int i=1;i<=n;i++)w[i]%=mod;
  68. for(int i=1;i<=n;i++)a[i]=read()%mod;
  69. build(1,1,n);
  70. for(int i=1;i<=m;i++){
  71. int x,l,r;
  72. x=read();l=read();r=read();
  73. if(x<l){
  74. printf("%lld\n",(query_b(1,l,r)-((query_a(1,l,r))%mod*(w[x]%mod))%mod+20*mod)%mod);
  75. }
  76. else if(x>r){
  77. printf("%lld\n",(((query_a(1,l,r))%mod*(w[x]%mod))%mod-query_b(1,l,r)+20*mod)%mod);
  78. }
  79. else{
  80. printf("%lld\n",(((query_a(1,l,x-1)%mod)*(w[x]%mod))%mod-query_b(1,l,x-1)+query_b(1,x+1,r)-((query_a(1,x+1,r)%mod)*(w[x]%mod))%mod+20*mod)%mod);
  81. }
  82. }
  83. return 0;
  84. }

线段树 洛谷P3932 浮游大陆的68号岛的更多相关文章

  1. [洛谷P3932]浮游大陆的68号岛

    题目大意:有一行物品,每两个物品之间有一个距离.每个物品有一个价值.现在问你若干问题,每个问题问你把l~r所有物品全部搬到物品x处需要多少价值. 把物品a搬到物品b处的价值为物品a的价值乘a到b的距离 ...

  2. P3932 浮游大陆的68号岛 【线段树】

    P3932 浮游大陆的68号岛 有一天小妖精们又在做游戏.这个游戏是这样的. 妖精仓库的储物点可以看做在一个数轴上.每一个储物点会有一些东西,同时他们之间存在距离. 每次他们会选出一个小妖精,然后剩下 ...

  3. P3932 浮游大陆的68号岛

    P3932 浮游大陆的68号岛 妖精仓库的储物点可以看做在一个数轴上.每一个储物点会有一些东西,同时他们之间存在距离. 每次他们会选出一个小妖精,然后剩下的人找到区间[l,r]储物点的所有东西,清点完 ...

  4. [Luogu3932] 浮游大陆的68号岛

    题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg 浮游大陆的68号岛,位于浮游大陆的边境地带.平时很少有人造访. 岛上被浓厚的森林覆盖. ...

  5. noip模拟赛 浮游大陆的68号岛

    题目描述 妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活. 换用更高尚的说法,是随时准备着为这个无药可救的世界献身. 然而孩子们的生活却总是无忧无虑的,幼体的黄金妖精们过着天真烂 ...

  6. LuoguP3932 浮游大陆的68号岛 题解

    Content 在一个无限长的数轴上有 \(n\) 个点.第 \(i\) 个点上面有 \(a_i\) 件物品,且第 \(i\) 个点到第 \(i+1\) 个点的距离为 \(b_i\). 定义从第 \( ...

  7. [线段树]洛谷P5278 算术天才⑨与等差数列

    题目描述 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能否形成公差为k ...

  8. 区间连续长度的线段树——洛谷P2894 [USACO08FEB]酒店Hotel

    https://www.luogu.org/problem/P2894 #include<cstdio> #include<iostream> using namespace ...

  9. AC日记——校门外的树 洛谷 P1047

    题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种 ...

随机推荐

  1. Java微信小程序开发_00_资源帖

    1.微信小程序开发:http://blog.csdn.net/column/details/13721.html?&page=1 2.微信小程序栏目:http://blog.csdn.net/ ...

  2. 使用myeclipes制造属于自己的jar

    选定你需要在jar中包含的package或者class 步骤1:右键export导出, 步骤2:导出类型为java --JRE  file. 步骤3:直接finish即可完成 如果希望你的jar带源码 ...

  3. codeforces 632C C. The Smallest String Concatenation(sort)

    C. The Smallest String Concatenation time limit per test 3 seconds memory limit per test 256 megabyt ...

  4. A唐纳德先生和假骰子(华师网络赛)

    Time limit per test: 1.0 seconds Memory limit: 256 megabytes 在进行某些桌游,例如 UNO 或者麻将的时候,常常会需要随机决定从谁开始.骰子 ...

  5. C#实现读写文本文件中的数据

    [1]首先我们定义一段假数据,这里以一个string为例字 static void Main(string[] args)        {            string data = &quo ...

  6. bzoj 4103: 异或运算 可持久化Trie

    题目大意: 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值\(A_{ij} = x_i \text{ xor } y_j ...

  7. xml schema 中如何定义类似Map的结构

    利用xs:unique关键字.在xs:element里添加unique节点,任意命名,然后用xs:selector来选择需要唯一的域, xs:field 里指定特定的字段. 例如:定义所有Item里的 ...

  8. linux shell查询

    查看当前版本可用的shell cat /etc/shells 查看当前使用的shell echo $0 查看当前用户默认使用的shell echo $SHELL

  9. tx1 高温不启动问题解决办法

    执行: vim /boot/extlinux/extlinux.conf 修改为下面红框标注的样式: 拷贝此文件下所有内容到/boot目录下. 检查是否成功:

  10. linux命令-bzip2压缩

    gzip和bzip2 都是压缩命令  区别是压缩算法不一样  一般bzip2压缩的效率高  都不能压缩目录 bzip2 压缩 [root@wangshaojun ~]# bzip2 install.l ...