题意:N个数Q次操作。一共两种操作:Q l r :询问[l,r]这个区间里的数字和,C l r c: [l,r]区间里的每个数都加上c。1 ≤ N,Q ≤ 100000.

方法:线段树的成段更新。注意懒惰标记。这只是为了有个模板。易错点在代码中以下划线标注。

  1. //16:06
  2. #include <cstdio>
  3. #include <cstring>
  4. #define N 100010
  5. #define lson l, mid, rt<<1
  6. #define rson mid+1, r, rt<<1|1
  7.  
  8. long long sum[N<<];
  9. long long col[N<<];//一直WA,只因这里写成Int。这个和上面那个要同个类型才是。
  10.  
  11. void pushUp(int rt) {
  12. sum[rt] = sum[rt<<] + sum[rt<<|];
  13. }
  14.  
  15. void pushDown(int len, int rt) {
  16. if (col[rt]) {
  17. col[rt<<] += col[rt];
  18. col[rt<<|] += col[rt];
  19. sum[rt<<] += (len-len/)*col[rt];
  20. sum[rt<<|] += (len/)*col[rt];
  21. col[rt] = ;
  22. }
  23. }
  24.  
  25. void build(int l, int r, int rt) {
  26. col[rt] = ;
  27. if (l==r) {
  28. scanf("%lld", &sum[rt]);
  29. return;
  30. }
  31. int mid = (l+r)/;
  32. build(lson);
  33. build(rson);
  34. pushUp(rt);
  35. }
  36.  
  37. void update(int L, int R, int v, int l, int r, int rt) {
  38. if (L <= l && r <= R) {
  39. col[rt] += v;
  40. sum[rt] += (r-l+1ll)*v;
  41. return;
  42. }
  43. pushDown(r-l+, rt);
  44. int mid = (l+r)/;
  45. if (L <= mid) update(L,R,v,lson);
  46. if (R > mid) update(L,R,v,rson);
  47. pushUp(rt);
  48. }
  49.  
  50. long long query(int L, int R, int l, int r, int rt) {
  51. if (L <= l && r <= R) {
  52. return sum[rt];
  53. }
  54. pushDown(r-l+,rt);
  55. int mid = (l+r)/;
  56. long long ans = ;
  57. if (L <= mid) ans += query(L,R,lson);
  58. if (R > mid) ans += query(L,R,rson);
  59. return ans;
  60. }
  61.  
  62. int main() {
  63. int n, q;
  64. while (scanf("%d%d", &n, &q) != EOF) {
  65. build(,n,);
  66. for (int i = ; i < q; i++) {
  67. char com[];
  68. scanf("%s", com);
  69. if (com[] == 'Q') {
  70. int l, r = ;
  71. scanf("%d%d", &l, &r);
  72. //printf("query %d %d\n", l, r);
  73. printf("%lld\n", query(l,r,,n,));
  74. } else if (com[] == 'C') {
  75. int l, r, add;
  76. scanf("%d%d%d", &l, &r, &add);
  77. update(l,r,add,,n,);
  78. }
  79. }
  80. }
  81. return ;
  82. }

另外感觉三个函数有很多重复点,写了一个紧凑版本,不过看起来代码量差不多,而且效率低了呢。

  1. //16:06
  2. #include <cstdio>
  3. #include <cstring>
  4. #define N 100010
  5. #define lson l, mid, rt<<1
  6. #define rson mid+1, r, rt<<1|1
  7.  
  8. long long sum[N<<];
  9. long long col[N<<];
  10.  
  11. void pushUp(int rt) {
  12. sum[rt] = sum[rt<<] + sum[rt<<|];
  13. }
  14.  
  15. void pushDown(int len, int rt) {
  16. if (col[rt]) {
  17. col[rt<<] += col[rt];
  18. col[rt<<|] += col[rt];
  19. sum[rt<<] += (len-len/)*col[rt];
  20. sum[rt<<|] += (len/)*col[rt];
  21. col[rt] = ;
  22. }
  23. }
  24.  
  25. long long basicDo(bool isBuild, int L, int R, int v, int l, int r, int rt) {
  26. if (isBuild) col[rt] = ;
  27. if (l == r || L <= l && r <= R) {
  28. if (isBuild) scanf("%lld", &sum[rt]);
  29. col[rt] += v;
  30. sum[rt] += (r-l+1ll)*v;
  31. return sum[rt];
  32. }
  33. pushDown(r-l+, rt);
  34. int mid = (l+r)/;
  35. long long ans = ;
  36. if (isBuild || L<= mid) ans += basicDo(isBuild,L,R,v,lson);
  37. if (isBuild || R > mid) ans += basicDo(isBuild,L,R,v,rson);
  38. pushUp(rt);
  39. return ans;
  40. }
  41. void build(int l, int r, int rt) {
  42. basicDo(true, ,,,l,r, rt);
  43. }
  44. void update(int L, int R, int v, int l, int r, int rt) {
  45. basicDo(false, L, R, v, l, r, rt);
  46. }
  47. long long query(int L, int R, int l, int r ,int rt) {
  48. return basicDo(false, L, R, , l, r, rt);
  49. }
  50.  
  51. int main() {
  52. int n, q;
  53. while (scanf("%d%d", &n, &q) != EOF) {
  54. build(,n,);
  55. for (int i = ; i < q; i++) {
  56. char com[];
  57. scanf("%s", com);
  58. if (com[] == 'Q') {
  59. int l, r = ;
  60. scanf("%d%d", &l, &r);
  61. //printf("query %d %d\n", l, r);
  62. printf("%lld\n", query(l,r,,n,));
  63. } else if (com[] == 'C') {
  64. int l, r, add;
  65. scanf("%d%d%d", &l, &r, &add);
  66. update(l,r,add,,n,);
  67. }
  68. }
  69. }
  70. return ;
  71. }

POJ 3468:A Simple Problem with Integers(线段树[成段更新])的更多相关文章

  1. POJ 3468 A Simple Problem with Integers (线段树成段更新)

    题目链接:http://poj.org/problem?id=3468 题意就是给你一组数据,成段累加,成段查询. 很久之前做的,复习了一下成段更新,就是在单点更新基础上多了一个懒惰标记变量.upda ...

  2. POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)

    A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...

  3. 【POJ】3468 A Simple Problem with Integers ——线段树 成段更新 懒惰标记

    A Simple Problem with Integers Time Limit:5000MS   Memory Limit:131072K Case Time Limit:2000MS Descr ...

  4. POJ3468_A Simple Problem with Integers(线段树/成段更新)

    解题报告 题意: 略 思路: 线段树成段更新,区间求和. #include <iostream> #include <cstring> #include <cstdio& ...

  5. poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和

    A Simple Problem with Integers Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...

  6. poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和(模板)

    A Simple Problem with Integers Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...

  7. poj 3468 A Simple Problem with Integers 线段树第一次 + 讲解

    A Simple Problem with Integers Description You have N integers, A1, A2, ... , AN. You need to deal w ...

  8. [POJ] 3468 A Simple Problem with Integers [线段树区间更新求和]

    A Simple Problem with Integers   Description You have N integers, A1, A2, ... , AN. You need to deal ...

  9. poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 75541   ...

  10. POJ 3468 A Simple Problem with Integers //线段树的成段更新

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 59046   ...

随机推荐

  1. nginx日志相关优化安全

    一.编写脚本实现nginx access日志轮询 配置日志切割脚本,如下: [root@nginx shell]# cat cut_nginx_log.sh #!/bin/bash #Author:M ...

  2. settings.py常规配置项

    settings.py常见配置项 1. 配置Django_Admin依照中文界面显示 LANGUAGE_CODE = 'zh-hans' 2. 数据库配置(默认使用sqlite3) 使用MySQL的配 ...

  3. python基本操作(五)

    if 判断 if 条件: 代码1 代码2 代码3 代码块(同一缩进级别的代码,例如代码1.代码2和代码3是相同缩进的代码,这三个代码组合在一起就是一个代码块,相同缩进的代码会自上而下的运行) cls ...

  4. java做http接口

    问题描述 我要对外提供一个http接口给别人调用...但是我不知道用java怎么做这个接口.请大家详细给我讲讲.从开发到如何发布到服务器.谢谢了 解决方案 如果你这个很简单的话,而且数量也很少,建议直 ...

  5. manjaro18 配置国内镜像源

    1.配置镜像源: sudo pacman-mirrors -i -c China -m rank 2.设置 archlinuxcn 源: sudo nano /etc/pacman.conf 添加以下 ...

  6. stm32L0工程建立(HAL+IAR,无cubemx)

    https://files.cnblogs.com/files/CodeWorkerLiMing/STM32HAL%E5%BA%93%E5%AD%A6%E4%B9%A0%E2%80%94%E5%B7% ...

  7. POJ:3160-Father Christmas flymouse

    Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Description After retirement as c ...

  8. German Collegiate Programming Contest 2018​

    // Coolest Ski Route #include <iostream> #include <cstdio> #include <cstring> #inc ...

  9. 奇数结点升序偶数结点降序的单链表排序(Python实现)

    题目 一个链表,奇数结点升序,偶数结点降序,要求变成一个全升序的链表. 例如:1->8->2->7->3->6->4->5,变为1->2->3-& ...

  10. BZOJ 5390: [Lydsy1806月赛]糖果商店

    F[i][j]表示总重量为i,最上面那个盒子中糖果种类为j的方案数 每次新加一个盒子,或者在原来盒子中加入一个糖 F[i][0]为中间状态,优化转移(表示最上面那个盒子不能加糖果) #include& ...