题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4288

题目大意:

维护一个有序数列{An},有三种操作:

1、添加一个元素。

2、删除一个元素。

3、求数列中下标%5 = 3的值的和

解题思路:

线段树不支持动态的添加,删除操作,所以本题用了离线处理,将所有数字事先离散化,给每个数字存一个位子,然后处理。

先离线把要用到的数离散化,去重并且排序,这样做添加或删除操作的时候就可以用二分找出下表并在线段树内修改,由于是单点更新,就不用”向下传递“了。

其实操作和单点更新一样,只是要用一个数组sum[5]记录对应区间内mod5的5种情况的和。所以当添加或删除一个数时都是在sum[1]这里增删,可以想想区间[2,2]是不是只有一个数,那么这个数的下标是1,mod5=1,所以在sum[1]处处理,更新父节点的时候要注意,父亲的左区间的下标与左儿子的下标mod5的情况完全相同,而父亲的右区间和右儿子的下标在左儿子的个数前提上mod5,所以cnt代表区间内有效数的个数。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define MID(l, r) (l + (r - l) / 2)
  6. #define lson(o) (o * 2)
  7. #define rson(o) (o * 2 + 1)
  8. using namespace std;
  9. typedef long long ll;
  10. const int INF = 1e9 +;
  11. const int maxn = 1e6 + ;
  12. int h, w, n;
  13. struct node
  14. {
  15. int l, r, tot;//tot表示节点个数
  16. ll sum[];
  17. }tree[maxn];
  18. void build(int o, int l, int r)
  19. {
  20. tree[o].l = l, tree[o].r = r;
  21. tree[o].tot = ;
  22. memset(tree[o].sum, , sizeof(tree[o].sum));
  23. if(l == r)
  24. {
  25. return;
  26. }
  27. int m = MID(l ,r), lc = lson(o), rc = rson(o);
  28. build(lc, l, m);
  29. build(rc, m + , r);
  30. }
  31. //a[p] += v * x
  32. //v表示符号,为1表示add 为-1表示del
  33. int p, v, x;
  34. void update(int o)
  35. {
  36. if(tree[o].l == tree[o].r)
  37. {
  38. tree[o].sum[] += v * x;
  39. tree[o].tot += v;
  40. return ;
  41. }
  42. int lc = lson(o), rc = rson(o);
  43. if(p <= tree[lc].r)update(lc);
  44. else update(rc);
  45. for(int i = ; i < ; i++)
  46. tree[o].sum[i] = tree[lc].sum[i] + tree[rc].sum[((i - tree[lc].tot) % + ) % ];
  47. tree[o].tot = tree[lc].tot + tree[rc].tot;
  48. }
  49.  
  50. int a[maxn], b[maxn], c[maxn];
  51. int main()
  52. {
  53. while(scanf("%d", &n) != EOF)
  54. {
  55. char s[];
  56. int tot = ;
  57. for(int i = ; i < n; i++)
  58. {
  59. scanf("%s", s);
  60. if(s[] == 's')
  61. a[i] = ;
  62. else
  63. {
  64. scanf("%d", &b[++tot]);
  65. if(s[] == 'a')
  66. a[i] = ;
  67. else a[i] = ;
  68. }
  69. }
  70. memcpy(c, b, sizeof(c));
  71. sort(b + , b + tot + );
  72. tot = unique(b + , b + tot + ) - (b + );
  73. build(, , tot);
  74. for(int i = , j = ; i < n; i++)
  75. {
  76. if(a[i] == )
  77. {
  78. printf("%lld\n", tree[].sum[]);
  79. }
  80. else
  81. {
  82. if(a[i] == )v = ;
  83. else v = -;
  84. p = lower_bound(b + , b + + tot, c[++j]) - b;
  85. x = b[p];
  86. update();
  87. }
  88. }
  89. }
  90. return ;
  91. }

hdu-4288 Coder---线段树+离线处理&离散化的更多相关文章

  1. hdu 4288 Coder (线段树+离线)

    题意: 刚开始有一个空集合.有三种操作: 1.往集合中加入一个集合中不存在的数 x 2.从集合中删除一个已经存在的数 x 3.计算集合的digest sum并输出.       digest sum求 ...

  2. HDU 4288 Coder(线段树)

    题意: 给定三种操作 1. add x 向序列中添加x,添加之后序列还保持有序 2. del x  删除序列中值为x的元素 3. sum  求下边模5等于3的元素和 思路: 直接暴力也可以过,就是看暴 ...

  3. HDU 4288 Coder 【线段树+离线处理+离散化】

    题意略. 离线处理,离散化.然后就是简单的线段树了.需要根据mod 5的值来维护.具体看代码了. /* 线段树+离散化+离线处理 */ #include <cstdio> #include ...

  4. HDU 4638-Group(线段树+离线处理)

    题意: 给n个编号,m个查询每个查询l,r,求下标区间[l,r]中能分成标号连续的组数(一组内的标号是连续的) 分析: 我们认为初始,每个标号为一个组(线段树维护区间组数),从左向右扫序列,当前标号, ...

  5. HDU 4417 【线段树+离线处理】

    http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意:找出给定区间内,有多少个数小于等于给定的数.用线段树维护的话会超时,要用到线段树的离线操作,对询问与 ...

  6. HDU 3333 & 3874 (线段树+离线询问)

    两个题目都是求区间之内,不重复的数字之和,3333需要离散化处理................. 调试了一下午........说多了都是泪........... #include <iostr ...

  7. HDU - 3874 Necklace (线段树 + 离线处理)

    欢迎參加--每周六晚的BestCoder(有米! ) Necklace Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65536/3 ...

  8. Necklace HDU - 3874 (线段树/树状数组 + 离线处理)

    Necklace HDU - 3874  Mery has a beautiful necklace. The necklace is made up of N magic balls. Each b ...

  9. POJ-2528 Mayor's posters (线段树区间更新+离散化)

    题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...

  10. hdu 4031 attack 线段树区间更新

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Subm ...

随机推荐

  1. DOC窗口之cd命令(windows)

    cd的全称是Change Directory,改变文件夹,也就是切换路径.后面可以接驱动器符号.完整路径和相对路径. 通常win+R,输入cmd,便会看到以下界面, 通常,这个命令下并没有我们想要处理 ...

  2. Twitter Storm 安装实战

    实际上安装Twitter Storm是上周三的事情了,周三的时候安装了一个单机版的,用WordCount跑了一下,感觉还不错.周四试着在集群上安装,碰到了一些问题,一直折腾到周五,留了个尾巴(没有做测 ...

  3. shell 进阶之匹配字符串

      一,操作字符串 1,字符串长度 expr 命令取字符串函数 自带shell函数读取 2,匹配字符串开头字串的长度   !!!!!!!!!!!!$substring是正则表达式.!!!!!!!!! ...

  4. postgres formencode.api.Invalid

    错误提示: Invalid: expected an int in the IntCol 'geom', got <type 'str'> '010100000007EBFFFC3A611 ...

  5. Windows的加密能力

    尽管Windows不再具备往日那样的统治地位,在智能手机领域,甚至已经沦落为一种小众平台,Windows仍然是主要的商业应用运行平台.软件开发平台.硬件及结构等设计软件运行平台.大多数人在学习计算机时 ...

  6. BulletedList用途

    1.用作最普通的信息显示(列表方式) 2.制作导航条 BulletedList3中模式 1.Text 文本 2.HyperLink 连接 2.LinkButton 按钮 BulletedList 导航 ...

  7. Gitflow 工作流程

    目存在两个长期分支: 主分支master 开发分支develop 前者用于存放对外发布的版本,任何时候在这个分支拿到的,都是稳定的分布版: 后者用于日常开发,存放最新的开发版. 其次,开发新功能或者修 ...

  8. python 中函数

    函数   def 函数名(形参):形参不用在前面定义,局部变量   参数      必须参数            必须以正确的顺序传参      关键字参数        加入关键字后可以不需要正确 ...

  9. redux基本使用

    redux数据流向 基本使用

  10. sql: 生日赠品中的相关算法

    ---2013年10月9日生日,就以2012年9月1日至2013年8月31日計算 (因為係生日月份前兩個月之最後一天為結算日) DECLARE @birthday datetime,@now date ...