http://codeforces.com/blog/entry/62013

两个结论:

1.一定有一个箱子不用动。

2.不动的箱子一定是加权前缀和为S/2的那个。

1显然,2由1易得。

于是问题变为:求一段区间前缀和>S/2的第一个数的位置。显然先求出S/2,再线段树上二分即可,实现过程见代码。

自定义struct比stl:pair快,注意取模和爆long long的问题。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #define ls (x<<1)
  4. #define rs (ls|1)
  5. #define lson ls,L,mid
  6. #define rson rs,mid+1,R
  7. #define rep(i,l,r) for (int i=(l); i<=(r); i++)
  8. typedef long long ll;
  9. using namespace std;
  10.  
  11. const int N=,inf=1e9,mod=1e9+;
  12. int n,Q,x,y,a[N],w[N];
  13. struct Tr{ ll s1,s2; }v[N<<];
  14. struct P{ ll x,y; };
  15.  
  16. void upd(int x){ v[x].s1=v[ls].s1+v[rs].s1; v[x].s2=(v[ls].s2+v[rs].s2)%mod; }
  17.  
  18. void build(int x,int L,int R){
  19. if (L==R){ v[x].s1=w[L]; v[x].s2=1ll*a[L]*w[L]%mod; return; }
  20. int mid=(L+R)>>;
  21. build(lson); build(rson); upd(x);
  22. }
  23.  
  24. void mdf(int x,int L,int R,int pos,int k){
  25. if (L==R){ v[x].s1=k; v[x].s2=1ll*a[pos]*k%mod; return; }
  26. int mid=(L+R)>>;
  27. if (pos<=mid) mdf(lson,pos,k); else mdf(rson,pos,k);
  28. upd(x);
  29. }
  30.  
  31. P que(int x,int L,int R,int l,int r){
  32. if (L==l && r==R) return (P){v[x].s1,v[x].s2};
  33. int mid=(L+R)>>;
  34. if (r<=mid) return que(lson,l,r);
  35. else if (l>mid) return que(rson,l,r);
  36. else{
  37. P s1=que(lson,l,mid),s2=que(rson,mid+,r);
  38. return (P){s1.x+s2.x,(s1.y+s2.y)%mod};
  39. }
  40. }
  41.  
  42. P ask(int x,int L,int R,int l,int r,ll k){
  43. if (L==l && r==R){
  44. if (v[x].s1<=k) return (P){inf,v[x].s1};
  45. if (L==R) return (P){l,};
  46. }
  47. int mid=(L+R)>>;
  48. if (r<=mid) return ask(lson,l,r,k);
  49. else if (l>mid) return ask(rson,l,r,k);
  50. else{
  51. ll sm=,res=inf;
  52. P cur=ask(lson,l,mid,k);
  53. res=min(res,cur.x); sm+=cur.y;
  54. if (res<inf) return (P){res,sm};
  55. cur=ask(rson,mid+,r,k-sm);
  56. res=min(res,cur.x); sm+=cur.y;
  57. return (P){res,sm};
  58. }
  59. }
  60.  
  61. int work(int l,int r){
  62. int k=ask(,,n,l,r,que(,,n,l,r).x/).x;
  63. P t1=(k==l) ? (P){,} : que(,,n,l,k-),t2=que(,,n,k,r);
  64. return ((a[k]*(t1.x%mod)-t1.y+t2.y-a[k]*(t2.x%mod))%mod+mod)%mod;
  65. }
  66.  
  67. int main(){
  68. freopen("1058f.in","r",stdin);
  69. freopen("1058f.out","w",stdout);
  70. scanf("%d%d",&n,&Q);
  71. rep(i,,n) scanf("%d",&a[i]),a[i]=a[i]-i;
  72. rep(i,,n) scanf("%d",&w[i]);
  73. build(,,n);
  74. while (Q--){
  75. scanf("%d%d",&x,&y);
  76. if (x<) mdf(,,n,-x,y); else printf("%d\n",work(x,y));
  77. }
  78. return ;
  79. }

[CF1053C]Putting Boxes Together(线段树)的更多相关文章

  1. 洛谷CF1030F Putting Boxes Together(树状数组)

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

  2. C. Okabe and Boxes 思维 模拟 or 线段树

    C. Okabe and Boxes 这个题目是一个有点思维的模拟,当时没有想到, 思维就是这个栈的排序这里,因为每次直接排序肯定会t的,所以不可以这么写,那怎么表示排序呢? 就是直接把栈清空,如果栈 ...

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

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

  4. Codeforces 834D The Bakery【dp+线段树维护+lazy】

    D. The Bakery time limit per test:2.5 seconds memory limit per test:256 megabytes input:standard inp ...

  5. Codeforces 626G Raffles(贪心+线段树)

    G. Raffles time limit per test:5 seconds memory limit per test:256 megabytes input:standard input ou ...

  6. Codeforces 834D The Bakery - 动态规划 - 线段树

    Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredient ...

  7. Codeforces 1053 C - Putting Boxes Together

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

  8. Codeforces Round #426 (Div. 1) B The Bakery (线段树+dp)

    B. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...

  9. Codeforces Round #426 (Div. 2) D 线段树优化dp

    D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...

随机推荐

  1. git本地分支和远程分支改名

    #1 将本地分支进行改名 git branch -m old_branch new_branch #2 将远程分支的老分支删除 git push origin :old_branch #3 将改名后的 ...

  2. 洛谷P3385负环

    传送门 #include <iostream> #include <cstdio> #include <cstring> #include <algorith ...

  3. grail开发环境的搭建

    本文参考:Grails入门指南(第二版) 1. 下载jdk和Grail http://www.oracle.com/technetwork/java/javase/downloads/ http:// ...

  4. django 建立一个简单的应用

    本人的用的版本是python 2.7.3和django 1.10.5,Windows10系统 1.首先通过命令建立项目和app 找到django的安装路径,我的路径是:C:\Python27\Lib\ ...

  5. hdu 5112 (2014北京现场赛 A题)

    给出某个时刻对应的速度 求出相邻时刻的平均速度 输出最大值 Sample Input23 // n2 2 //t v1 13 430 31 52 0 Sample OutputCase #1: 2.0 ...

  6. Spark(八)JVM调优以及GC垃圾收集器

    一JVM结构 1 Java内存结构 JVM内存结构主要有三大块:堆内存.方法区和栈. 堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间.From Survivo ...

  7. day7 面向对象进阶

    面向对象高级语法部分 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例 ...

  8. bash101总结

    看了 bash101 ,做的一些总结吧,都是些常见用法,易错 1. 有空格会显示多行 2.contine 书里太细了,有空补起来

  9. js获取iframe的id

    有一个需求是在iframe页面调用父页面一个方法,开始我用window.parent.length来判断页面有几个层,但是不好用,因为我的浏览器安装了一个插件,这个插件会动态向页面插入一个iframe ...

  10. RabbitMQ 相关理论部分

    集群配置方式 RabbitMQ可以通过三种方法来部署分布式集群系统,分别是:cluster,federation,shovel cluster: 不支持跨网段,用于同一个网段内的局域网 可以随意的动态 ...