vp的时候没码出来。。

我们用set去维护, 每一块区域, 每块区域内的元素与下一个元素的差值刚好为ki,每次加值的时候我们暴力合并,

可以发现我们最多合并O(n)次。 然后写个线段树就没了。

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define fi first
  4. #define se second
  5. #define mk make_pair
  6. #define PLL pair<LL, LL>
  7. #define PLI pair<LL, int>
  8. #define PII pair<int, int>
  9. #define SZ(x) ((int)x.size())
  10. #define ull unsigned long long
  11.  
  12. using namespace std;
  13.  
  14. const int N = 1e5 + ;
  15. const int inf = 0x3f3f3f3f;
  16. const LL INF = 0x3f3f3f3f3f3f3f3f;
  17. const int mod = 1e9 + ;
  18. const double eps = 1e-;
  19. const double PI = acos(-);
  20.  
  21. int n, q, val[N], k[N];
  22. LL prefix[N];
  23. set<PII> seg;
  24. char op[];
  25.  
  26. LL a[N << ], add[N << ];
  27. #define lson l, mid, rt << 1
  28. #define rson mid + 1, r, rt << 1 | 1
  29. void push(int rt, int l, int mid, int r) {
  30. if(add[rt]) {
  31. a[rt << ] += add[rt] * (mid - l + );
  32. a[rt << | ] += add[rt] * (r - mid);
  33. add[rt << ] += add[rt];
  34. add[rt << | ] += add[rt];
  35. add[rt] = ;
  36. }
  37. }
  38. void build(int l, int r, int rt) {
  39. if(l == r) {
  40. a[rt] = val[l];
  41. return;
  42. }
  43. int mid = l + r >> ;
  44. build(lson); build(rson);
  45. a[rt] = a[rt << ] + a[rt << | ];
  46. }
  47.  
  48. void update(int L, int R, LL val, int l, int r, int rt) {
  49. if(l >= L && r <= R) {
  50. a[rt] += val * (r - l + );
  51. add[rt] += val;
  52. return;
  53. }
  54. int mid = l + r >> ;
  55. push(rt, l, mid, r);
  56. if(L <= mid) update(L, R, val, lson);
  57. if(R > mid) update(L, R, val, rson);
  58. a[rt] = a[rt << ] + a[rt << | ];
  59. }
  60. LL query(int L, int R, int l, int r, int rt) {
  61. if(l >= L && r <= R) return a[rt];
  62. int mid = l + r >> ;
  63. push(rt, l, mid, r);
  64. if(R <= mid) return query(L, R, lson);
  65. else if(L > mid) return query(L, R, rson);
  66. else return query(L, R, lson) + query(L, R, rson);
  67. }
  68.  
  69. int main() {
  70. scanf("%d", &n);
  71. for(int i = ; i <= n; i++) {
  72. scanf("%d", &val[i]);
  73. prefix[i] = prefix[i - ] + val[i];
  74. }
  75. for(int i = ; i < n; i++) scanf("%d", &k[i]);
  76. for(int i = ; i <= n; i++) seg.insert(mk(i, i));
  77. build(, n, );
  78. scanf("%d", &q);
  79. while(q--) {
  80. scanf("%s", op);
  81. if(op[] == '+') {
  82. int x, v; scanf("%d%d", &x, &v);
  83. auto sg = seg.upper_bound(mk(x, inf)); sg--;
  84. int L = sg->fi, R = sg->se;
  85. seg.erase(sg);
  86. if(L <= x - ) seg.insert(mk(L, x - ));
  87. update(x, R, v, , n, );
  88. while(R < n) {
  89. LL v1 = query(R, R, , n, );
  90. LL v2 = query(R + , R + , , n, );
  91. if(v1 + k[R] <= v2) break;
  92. LL add = v1 + k[R] - v2;
  93. auto sg = seg.lower_bound(mk(R + , R + ));
  94. update(sg->fi, sg->se, add, , n, );
  95. R = sg->se;
  96. seg.erase(sg);
  97. }
  98. seg.insert(mk(x, R));
  99. } else {
  100. int L, R; scanf("%d%d", &L, &R);
  101. printf("%lld\n", query(L, R, , n, ));
  102. }
  103. }
  104. return ;
  105. }
  106.  
  107. /*
  108. */

Codeforces 1136E Nastya Hasn't Written a Legend 线段树的更多相关文章

  1. Codeforces 1136E - Nastya Hasn't Written a Legend - [线段树+二分]

    题目链接:https://codeforces.com/problemset/problem/1136/E 题意: 给出一个 $a[1 \sim n]$,以及一个 $k[1 \sim (n-1)]$, ...

  2. Codeforces 1136E Nastya Hasn't Written a Legend (线段树教做人系列)

    题意:有一个数组a和一个数组k,数组a一直保持一个性质:a[i + 1] >= a[i] + k[i].有两种操作:1,给某个元素加上x,但是加上之后要保持数组a的性质.比如a[i]加上x之后, ...

  3. codeforces#1136E. Nastya Hasn't Written a Legend(二分+线段树)

    题目链接: http://codeforces.com/contest/1136/problem/E 题意: 初始有a数组和k数组 有两种操作,一,求l到r的区间和,二,$a_i\pm x$ 并且会有 ...

  4. [Codeforces 464E] The Classic Problem(可持久化线段树)

    [Codeforces 464E] The Classic Problem(可持久化线段树) 题面 给出一个带权无向图,每条边的边权是\(2^{x_i}(x_i<10^5)\),求s到t的最短路 ...

  5. Codeforces Round #244 (Div. 2) B. Prison Transfer 线段树rmq

    B. Prison Transfer Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/pro ...

  6. Codeforces Round #603 (Div. 2) E. Editor(线段树)

    链接: https://codeforces.com/contest/1263/problem/E 题意: The development of a text editor is a hard pro ...

  7. Educational Codeforces Round 6 E. New Year Tree dfs+线段树

    题目链接:http://codeforces.com/contest/620/problem/E E. New Year Tree time limit per test 3 seconds memo ...

  8. codeforces 893F - Physical Education Lessons 动态开点线段树合并

    https://codeforces.com/contest/893/problem/F 题意: 给一个有根树, 多次查询,每次查询对于$x$i点的子树中,距离$x$小于等于$k$的所有点中权值最小的 ...

  9. Codeforces Round #530 (Div. 2) F (树形dp+线段树)

    F. Cookies 链接:http://codeforces.com/contest/1099/problem/F 题意: 给你一棵树,树上有n个节点,每个节点上有ai块饼干,在这个节点上的每块饼干 ...

随机推荐

  1. $Django 客户端->wsgi->中间组件->urls->views(model,template) 总结+补充(事物,choices,inclusion_tag)!

    1 HTTP协议:(重点)  -请求   -请求首行    -GET /index HTTP/1.1 \r\n   -请求头部    -key:value------>\r\n分割    _ke ...

  2. Windows Server 2008 R2 报错事件ID:10之WMI报错

    问题描述: Details -Event filter with query "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHE ...

  3. 增加一台web机注意事项

    2017年4月18日 15:23:57 星期二 增加一台web机时, 先不要挂载进lb 1. 需要将此机器的ip加入到其它服务的白名单内: 数据库, 缓存, 第三方接口等 2. 绑定hosts, 点点 ...

  4. 随机函数rand()和srand()

    C++中随机函数rand()和srand()的用法 一.rand() 函数名:   rand     功   能:   随机数发生器   用   法:   int rand(void); 所在头文件: ...

  5. 腾讯云CVM之间配置免密钥登录

    背景: 1客户A和B俩台主机之间需要实现免密钥登录,已绑定腾讯云申请的密钥对 系统:centos7.3 A:192.168.0.100 B:192.168.0.84 A主机的私钥文件:aaa B主机的 ...

  6. Android组件化demo实现以及遇坑分享

    首先贴出demo的github地址:GitHub - TenzLiu/TenzModuleDemo: android组件化demo 作者:TenzLiu原文链接:https://www.jianshu ...

  7. Hibernatede 一对多映射配置

    Hibernatede 一对多映射配置 以公司和员工为例:公司是一,员工是多   第一步 创建两个实体类,公司和员工        写核心配置文件hibernate.cfg.xml        写映 ...

  8. chkconfig: command not found

    问题描述 Ubuntu 16.04 下安装 Nginx 服务器,在添加 nginx 服务时出现如下信息 # chkconfig --add nginx chkconfig: command not f ...

  9. numpy:dot与multiply

    http://blog.csdn.net/iamzhangzhuping/article/details/52370241

  10. Netty多人聊天室

    在简单聊天室的代码中修改ChatServerHandler类,就可以模拟多人聊天的功能 package com.cppdy.server; import io.netty.channel.Channe ...