题意

题目链接

Sol

直接做肯定不好搞(反正我不会。。)

直接开\(n\)个Pair类型的set,维护每个数的出现位置

每次在set中二分后暴力合并即可

然后就是树状数组的基本操作了

时间复杂度:\(O(nlog^2n)\)

  1. #include<bits/stdc++.h>
  2. #define Pair pair<int, int>
  3. #define MP make_pair
  4. #define fi first
  5. #define se second
  6. #define lb(x) (x & (-x))
  7. using namespace std;
  8. const int MAXN = 1e6 + 10, INF = 2147483646;
  9. inline int read() {
  10. char c = getchar(); int x = 0, f = 1;
  11. while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
  12. while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  13. return x * f;
  14. }
  15. int N, M, T[MAXN];
  16. void Add(int x, int v) {
  17. while(x <= N) T[x] += v, x += lb(x);
  18. }
  19. void AddInt(int l, int r, int val) {
  20. Add(l, val); Add(r + 1, -val);
  21. }
  22. int Query(int x) {
  23. int ans = 0;
  24. while(x) ans += T[x], x -= lb(x);
  25. return ans;
  26. }
  27. set<Pair> S[MAXN];
  28. #define sit set<Pair>::iterator
  29. void Add(int l, int r, int x) {
  30. set<Pair> &s = S[x];
  31. sit it = s.lower_bound(MP(l, r));
  32. if(it != s.begin()) {
  33. it--;
  34. if(it -> se > r) return ;
  35. if(it -> se >= l ) {
  36. l = min(l, it -> fi); r = max(r, it -> se);
  37. AddInt(it -> fi, it -> se, -1);
  38. s.erase(it++);
  39. }
  40. }
  41. it = s.lower_bound(MP(l, r));
  42. while((it -> se >= l && it -> se <= r) || (it -> fi >= l && it -> fi <= r)) {
  43. l = min(l, it -> fi); r = max(r, it -> se);
  44. AddInt(it -> fi, it -> se, -1);
  45. s.erase(it++);
  46. }
  47. s.insert(MP(l, r));
  48. AddInt(l, r, 1);
  49. }
  50. int main() {
  51. // freopen("a.in", "r", stdin); freopen("b.out", "w", stdout);
  52. N = read(); M = read();
  53. for(int i = 1; i <= N; i++) S[i].insert(MP(INF, INF));
  54. while(M--) {
  55. int opt = read();
  56. if(opt == 0) {int l = read(), r = read(), val = read(); Add(l, r, val);}
  57. else printf("%d\n", Query(read()));
  58. }
  59. return 0;
  60. }
  61. /*
  62. 5 5
  63. 0 2 4 4
  64. 0 3 5 5
  65. 0 1 5 5
  66. 1 5
  67. 1 3
  68. 5 12
  69. 0 1 1 1
  70. 1 1
  71. 0 1 2 1
  72. 1 1
  73. 0 1 3 1
  74. 1 1
  75. 0 2 3 1
  76. 1 1
  77. 0 4 5 1
  78. 1 1
  79. 0 1 5 1
  80. 1 1
  81. */

codechef Many Lists(树状数组 set)的更多相关文章

  1. 【分块+树状数组】codechef November Challenge 2014 .Chef and Churu

    https://www.codechef.com/problems/FNCS [题意] [思路] 把n个函数分成√n块,预处理出每块中各个点(n个)被块中函数(√n个)覆盖的次数 查询时求前缀和,对于 ...

  2. 【xsy2111】 【CODECHEF】Chef and Churus 分块+树状数组

    题目大意:给你一个长度为$n$的数列$a_i$,定义$f_i=\sum_{j=l_i}^{r_i} num_j$. 有$m$个操作: 操作1:询问一个区间$l,r$请你求出$\sum_{i=l}^{r ...

  3. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2221  Solved: 1179[Submit][Sta ...

  4. bzoj1878--离线+树状数组

    这题在线做很麻烦,所以我们选择离线. 首先预处理出数组next[i]表示i这个位置的颜色下一次出现的位置. 然后对与每种颜色第一次出现的位置x,将a[x]++. 将每个询问按左端点排序,再从左往右扫, ...

  5. codeforces 597C C. Subsequences(dp+树状数组)

    题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...

  6. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  7. BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1399  Solved: 694[Submit][Status] ...

  8. BZOJ 3289: Mato的文件管理[莫队算法 树状数组]

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2399  Solved: 988[Submit][Status][Di ...

  9. 【Codeforces163E】e-Government AC自动机fail树 + DFS序 + 树状数组

    E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...

随机推荐

  1. Working with Metal—Overview

    看完这个 WWDC 之后的总结. Metal 可以在单位时间内提供 10 倍的 draw call 调用. Background About Draw Call 每一次 draw call 调用都必须 ...

  2. POJ 2196

    #include <iostream> using namespace std; int sum_10; int sum_12; int sum_16; int fun_10(int nu ...

  3. QuantLib 金融计算——随机过程之一般 Black Scholes 过程

    目录 QuantLib 金融计算--随机过程之一般 Black Scholes 过程 一般 Black Scholes 过程 如果未做特别说明,文中的程序都是 Python3 代码. QuantLib ...

  4. SQL语句02(连表查询)

    ---恢复内容开始--- sql1992sql分类    1.笛卡尔积 (表乘表) 例:select * from emp,dept;    2.等值连接 表的连接条件使用“=” 例:select * ...

  5. vue.js - axios Get、Post方法传参给 .net core webapi。

    一:axios中是 Get请求: 1:在vue项目中通过params属性携带数据: let _self = this; axios({ method:'get', url:'http://localh ...

  6. JavaScript -- 定义二维数组

    方法一:直接定义并且初始化,这种遇到数量少的情况可以用var _TheArray = [["0-1","0-2"],["1-1"," ...

  7. Scrum 冲刺博客第六篇

    一.当天站立式会议照片一张 二.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中 昨天已完成的工作 判断用户输入的答案是否正确并将其输出到界面中 今天计划完成的工作 对排行榜 ...

  8. [shell进阶]——shell多线程

    关于shell的多线程 1. 多线程并发执行任务,而不用一台台的串行执行,能更快更高效 2. Shell并没有多线程的概念,所以: * 一般使用wait.read等命令技巧性地模拟多线程实 * 使用命 ...

  9. oracle 如何查看已经创建好的触发器语句-select trigger_body from user_triggers where trigger_name='XXXX';

    使用trigge_body查询, select trigger_body from user_triggers where trigger_name='XXXX'; 如下图: SQL> sele ...

  10. XMPP之openfire无法启动

    之前半个月自学ios的时候自己也配置过xmpp框架,也从github上下载了demo试了下,也是很完美运行的,最近想着再回头把XMPP框架系统的学习一下 ,毕竟当时学的时候还是在虚拟机中,卡死了.我这 ...