Link:

Codeforces 1053C 传送门

Solution:

先推出一个结论:

最后必有一个点不动且其为权值上最中间的一个点

证明用反证证出如果不在中间的点必有一段能用代价少的替代多的

这样问题转换为求出区间第一个大于权值和一半的点,并求结果

如果只考虑半边的结果为$\sum_{i=1}^{mid} (pos[mid]-pos[i]-(mid-i))*w[i]$

将$pos[i]$修改为$pos[i]-i$之后维护$\sum pos[i]*w[i]$的和即可

以上操作可以用两颗线段树来维护

注意:

1、维护$w[i]$时不能取模!

2、对于求权值中间点可以二分+树状数组也可以直接在线段树上二分

线段树上二分时注意如果已经在区间内查询值要不断更新

Code:

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. #define X first
  5. #define Y second
  6. #define pb push_back
  7. #define mid ((l+r)>>1)
  8. #define lc k<<1,l,mid
  9. #define rc k<<1|1,mid+1,r
  10. typedef double db;
  11. typedef long long ll;
  12. typedef pair<int,int> P;
  13. const int MAXN=5e5+,INF=<<,MOD=1e9+;
  14.  
  15. struct SGT
  16. {
  17. ll seg[MAXN<<];
  18. //分清何时要取模
  19. void Update(int a,ll x,int f,int k,int l,int r)
  20. {
  21. if(l==r)
  22. {seg[k]+=x;if(f) seg[k]%=MOD;return;}
  23. if(a<=mid) Update(a,x,f,lc);
  24. else Update(a,x,f,rc);
  25. seg[k]=seg[k<<]+seg[k<<|];
  26. if(f) seg[k]%=MOD;
  27. }
  28. ll Query(int a,int b,int f,int k,int l,int r)
  29. {
  30. if(a<=l&&r<=b) return seg[k];
  31. ll ret=;
  32. if(a<=mid) ret+=Query(a,b,f,lc);
  33. if(b>mid) ret+=Query(a,b,f,rc);
  34. return f?ret%MOD:ret;
  35. }
  36. //注意线段树二分的处理及此处的引用
  37. int Find(int a,int b,ll &x,int k,int l,int r)
  38. {
  39. if(a<=l&&r<=b)
  40. {
  41. if(seg[k]<x){x-=seg[k];return INF;}
  42. if(l==r) return l;
  43. if(x<=seg[k<<]) return Find(a,b,x,lc);
  44. else{x-=seg[k<<];return Find(a,b,x,rc);}
  45. }
  46. int ret=INF;
  47. if(a<=mid)
  48. ret=min(ret,Find(a,b,x,lc));
  49. if(b>mid&&ret==INF)
  50. ret=min(ret,Find(a,b,x,rc));
  51. return ret;
  52. }
  53. }sw,sm;
  54. int n,q,x,y,pos[MAXN],w[MAXN];
  55.  
  56. int main()
  57. {
  58. scanf("%d%d",&n,&q);
  59. for(int i=;i<=n;i++)
  60. scanf("%d",&pos[i]),pos[i]-=i;
  61. for(int i=;i<=n;i++)
  62. {
  63. scanf("%d",&w[i]);
  64. sw.Update(i,w[i],,,,n);
  65. sm.Update(i,1ll*w[i]*pos[i],,,,n);
  66. }
  67.  
  68. while(q--)
  69. {
  70. scanf("%d%d",&x,&y);
  71. if(x<)
  72. {
  73. x=-x;
  74. sw.Update(x,-w[x],,,,n);
  75. sm.Update(x,-1ll*w[x]*pos[x],,,,n);
  76. w[x]=y;
  77. sw.Update(x,w[x],,,,n);
  78. sm.Update(x,1ll*w[x]*pos[x],,,,n);
  79. }
  80. else
  81. {
  82. //此时不能取模
  83. ll sum=(sw.Query(x,y,,,,n)+)/;
  84. int p=sw.Find(x,y,sum,,,n);
  85. ll t1=(sw.Query(x,p,,,,n)*pos[p]%MOD-sm.Query(x,p,,,,n)+MOD)%MOD;
  86. ll t2=(-sw.Query(p+,y,,,,n)*pos[p]%MOD+sm.Query(p+,y,,,,n)+MOD)%MOD;
  87. printf("%lld\n",(t1+t2)%MOD);
  88. }
  89. }
  90. return ;
  91. }

[Codeforces 1053C] Putting Boxes Together的更多相关文章

  1. Codeforces 1053C Putting Boxes Together 树状数组

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF1053C.html 题目传送门 - CF1053C 题意 有 $n$ 个物品,第 $i$ 个物品在位置 $a ...

  2. 2018.09.24 codeforces 1053C. Putting Boxes Together(线段树)

    传送门 就是让你维护动态的区间带权中位数. 然而昨晚比赛时并没有调出来. 想找到带权中位数的中点可以二分(也可以直接在线段树上找). 也就是二分出第一个断点,使得断点左边的和恰好大于或等于断点右边的和 ...

  3. Codeforces 1053 C - Putting Boxes Together

    C - Putting Boxes Together 思路: 求带权中位数 用树状数组维护修改 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) ...

  4. CodeForces 1058 F Putting Boxes Together 树状数组,带权中位数

    Putting Boxes Together 题意: 现在有n个物品,第i个物品他的位置在a[i],他的重量为w[i].每一个物品移动一步的代价为他的w[i].目前有2种操作: 1. x y 将第x的 ...

  5. Putting Boxes Together CodeForces - 1030F (带权中位数)

    #include <iostream> #include <algorithm> #include <cstdio> #include <math.h> ...

  6. Codeforces 488B - Candy Boxes

    B. Candy Boxes 题目链接:http://codeforces.com/problemset/problem/488/B time limit per test 1 second memo ...

  7. Educational Codeforces Round 31- D. Boxes And Balls

    D. Boxes And Balls time limit per test2 seconds memory limit per test256 megabytes 题目链接:http://codef ...

  8. [CF1053C]Putting Boxes Together(线段树)

    http://codeforces.com/blog/entry/62013 两个结论: 1.一定有一个箱子不用动. 2.不动的箱子一定是加权前缀和为S/2的那个. 1显然,2由1易得. 于是问题变为 ...

  9. CF1030F Putting Boxes Together

    昨晚的比赛题.(像我这种蒟蒻只能打打div2) 题意 给你$n$个物品,每一个物品$i$,有一个权值$w_i$和一个位置$a_i$,定义移动一个物品$i$到位置$t$的代价为$w_i * \left ...

随机推荐

  1. 继承自UITableView的类自带tableView属性,不需要在创建该属性,因为父类UITableView已经创建.

      继承自UITableView的类自带tableView属性,不需要在创建该属性,因为父类UITableView已经创建.   https://www.evernote.com/shard/s227 ...

  2. Vue.js最佳实践(五招让你成为Vue.js大师)

    对大部分人来说,掌握Vue.js基本的几个API后就已经能够正常地开发前端网站.但如果你想更加高效地使用Vue来开发,成为Vue.js大师,那下面我要传授的这五招你一定得认真学习一下了. 第一招:化繁 ...

  3. 【洛谷 P4320】 道路相遇 (圆方树,LCA)

    题目链接 题意:给一张无向图和\(M\)个询问,问\(u,v\)之间的路径的必经之点的个数. 对图建出圆方树,然后必经之点就是两点路径经过的原点个数,用\((dep[u]+dep[v]-dep[LCA ...

  4. Python第三方库jieba(中文分词)入门与进阶(官方文档)

    jieba "结巴"中文分词:做最好的 Python 中文分词组件 github:https://github.com/fxsjy/jieba 特点 支持三种分词模式: 精确模式, ...

  5. Python-字符串处理 str.format()

    Python中内置的%操作符可用于格式化字符串操作,控制字符串的呈现格式.Python中还有其他的格式化字符串的方式,但%操作符的使用是最方便的. 另外python还有一个更强大的字符串处理函数 st ...

  6. [LabVIEW架构]ActorFramework(一)

    前言 小黑结婚回来第二周了,每天忙于程序设计,时间比较紧张,所以文章一直没出来,也算憋大招了. 近期小黑将与大家一起认识一下ActorFramework,既是对自己一段时间写AF程序的总结,也是梳理, ...

  7. windows server 2012 IIS配置之FTP站点

    原文地址:[原创]winserver2012IIS配置之FTP站点作者:hkmysterious   一.实验拓扑: 使server2012客户计算机通过ftp方式从FTP服务器上下载已上传并共享的文 ...

  8. socket编程之select(),poll(),epoll()

    socket编程,通信 client端  socket() ----->connect() ------->recv() -----> close(); server端 socket ...

  9. jstack 命令学习笔记

    大部分内容转载自:Java命令学习系列(二)--Jstack jstack - 查看堆栈信息 jstack ( Stack Trace for java ) 命令主要作用就是为了查看堆栈信息.它可以用 ...

  10. [设计模式-行为型]模板方法模式(Template Method)

    一句话 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 概括