题面

传送门

分析

分三维考虑

对第一维,直接排序

对第二维和第三维,我们这样考虑

朴素的方法是建k棵Treap,第i棵Treap里存第二维值为k的第三维数值

每次查询一组(a,b,c),只要在1~b的Treap里查询<=c的数的个数即可

这样可以保证一定是合法的,因为排序,第一维肯定<=a,因为Treap根据值域建,第二维肯定<=b

又根据平衡树的性质,第三维肯定<=c

这样总的时间复杂度是\(O(nk\log n)\),无法接受

我们考虑用树状数组的拆分方法,把一组询问拆成\(\log k\)组询问

第i棵Treap存储的是第二维在${[i- \rm lowbit}(i)+1,i] $之间的三元组的第三维

然后按照树状数组查找和更新的方法求出答案即可

时间复杂度\(O(n \log n \log k)\)

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cstdlib>
  6. #include<stack>
  7. #define maxn 100005
  8. #define maxv 200005
  9. #define maxs 5000005
  10. #define lson tree[p].l
  11. #define rson tree[p].r
  12. using namespace std;
  13. int n,k;
  14. struct node {
  15. int l;
  16. int r;
  17. int val;
  18. int dat;
  19. int cnt;
  20. int size;
  21. } tree[maxs];
  22. int tot=0;
  23. int root[maxv];
  24. void update(int p) {
  25. tree[p].size=tree[lson].size+tree[rson].size+tree[p].cnt;
  26. }
  27. void zig(int &p) {
  28. int q=tree[p].l;
  29. tree[p].l=tree[q].r;
  30. tree[q].r=p;
  31. p=q;
  32. update(tree[p].r);
  33. update(p);
  34. }
  35. void zag(int &p) {
  36. int q=tree[p].r;
  37. tree[p].r=tree[q].l;
  38. tree[q].l=p;
  39. p=q;
  40. update(tree[p].l);
  41. update(p);
  42. }
  43. int New(int val) {
  44. tree[++tot].val=val;
  45. tree[tot].dat=rand();
  46. tree[tot].cnt=1;
  47. tree[tot].size=1;
  48. return tot;
  49. }
  50. void insert(int &p,int val) {
  51. if(p==0) {
  52. p=New(val);
  53. return;
  54. }
  55. if(val==tree[p].val) {
  56. tree[p].cnt++;
  57. update(p);
  58. return;
  59. }
  60. if(val<tree[p].val) {
  61. insert(lson,val);
  62. if(tree[lson].dat>tree[p].dat) zig(p);
  63. } else {
  64. insert(rson,val);
  65. if(tree[rson].dat>tree[p].dat) zag(p);
  66. }
  67. update(p);
  68. }
  69. int get_rank_by_val(int p,int val) {
  70. if(p==0) return 0;
  71. if(val==tree[p].val) {
  72. return tree[lson].size+tree[p].cnt;
  73. }
  74. if(val<tree[p].val) {
  75. return get_rank_by_val(lson,val);
  76. }
  77. return get_rank_by_val(rson,val)+tree[lson].size+tree[p].cnt;
  78. }
  79. inline int lowbit(int x) {
  80. return x&-x;
  81. }
  82. void update(int x,int v){
  83. while(x<=k){ //注意,树状数组是根据值域建的,所以范围是k,不要写成x<=n
  84. // printf(" tree %d, update %d\n",x,v);
  85. insert(root[x],v);
  86. x+=lowbit(x);
  87. }
  88. }
  89. int query(int x,int v){
  90. int level=0;
  91. while(x){
  92. // printf(" tree %d, query %d\n",x,v );
  93. level+=get_rank_by_val(root[x],v);
  94. x-=lowbit(x);
  95. }
  96. return level;
  97. }
  98. struct flower{
  99. int s;
  100. int c;
  101. int m;
  102. friend bool operator == (flower a,flower b){
  103. return a.s==b.s&&a.c==b.c&&a.m==b.m;
  104. }
  105. friend bool operator < (flower a,flower b){
  106. if(a.s==b.s){
  107. if(a.c==b.c) return a.m<b.m;
  108. else return a.c<b.c;
  109. }else{
  110. return a.s<b.s;
  111. }
  112. }
  113. }a[maxn];
  114. int level[maxn];
  115. int cnt[maxn];
  116. stack<int>s;
  117. int main() {
  118. scanf("%d %d",&n,&k);
  119. for(int i=1;i<=n;i++){
  120. scanf("%d %d %d",&a[i].s,&a[i].c,&a[i].m);
  121. }
  122. sort(a+1,a+1+n);
  123. for(int i=1;i<=n;i++){
  124. if(a[i]==a[i+1]) s.push(i);
  125. else{
  126. level[i]=query(a[i].c,a[i].m);
  127. while(!s.empty()){
  128. level[s.top()]=level[i];
  129. s.pop();
  130. }
  131. }
  132. update(a[i].c,a[i].m);
  133. }
  134. for(int i=1;i<=n;i++){
  135. cnt[level[i]]++;
  136. }
  137. for(int i=0;i<=n-1;i++){
  138. printf("%d\n",cnt[i]);
  139. }
  140. }

BZOJ 3262(Treap+树状数组)的更多相关文章

  1. BZOJ - 3224 Tyvj 1728 普通平衡树 (treap/树状数组)

    题目链接 treap及树状数组模板题. treap版: #include<bits/stdc++.h> using namespace std; typedef long long ll; ...

  2. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

  3. BZOJ 2141 排队(树状数组套主席树)

    解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...

  4. bzoj 1878 SDOI2009树状数组 离线操作

    本来想写2120的,结果想起来了这个 我们先对于询问左端点排序,用树状数组存区间字母个数,对于每种字母, 第一次出现的位置记录为1,剩下的记录为0,然后记录下,每种颜色 后面第一个和他相同颜色的位置 ...

  5. bzoj 4785: [Zjoi2017]树状数组【树套树】

    参考:https://www.cnblogs.com/ljh2000-jump/p/6686960.html 由于操作反过来了,所以显然树状数组维护后缀和,所以本来想查询(1,r)-(1,l-1),现 ...

  6. BZOJ 4765(分块+树状数组)

    题面 传送门 "奋战三星期,造台计算机".小G响应号召,花了三小时造了台普通计算姬.普通计算姬比普通计算机要厉害一些 .普通计算机能计算数列区间和,而普通计算姬能计算树中子树和.更 ...

  7. BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树

    题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l ...

  8. BZOJ 4999 LCA树状数组差分维护DFS序

    Description 给一颗树,每个节点有个初始值 现在支持以下两种操作: 1. C i x(0<=x<2^31) 表示将i节点的值改为x 2. Q i j x(0<=x<2 ...

  9. bzoj 3262 陌上花开 - CDQ分治 - 树状数组

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...

随机推荐

  1. vue中搜索关键词,使文本标红

    UserHead.vue中搜索框: <!-- 搜索 --> <el-col :span="6" :offset="8" class=" ...

  2. python连接mariadb报错解决1045, "Access denied for user 'root'@'192.168.0.50' (using password: YES)

    [root@localhost ~]# python Python 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Ha ...

  3. STM32之红外遥控信号自学习实现

    一.序言 很早前就想实现这个红外遥控自学习的这个实验,用于来自己控制房子里如空调等红外遥控设备的自动化,NEC的标准到具体的产品上可能就被厂家定义为不一样了,所以自学习就应该是接收到什么就发送什么,不 ...

  4. kali优化配置(3)--工具箱

    1.netcat 收集信息.Telnet/banner.传输文本信息.连接服务器端口. *通过IP,连接服务器端口: *信息通信: *重定向符号:> (e.g:>>ps.txt:重定 ...

  5. python基础--文件的操作

    #r w a 文件读取操作 默认打开为读操作 #f=open('coldplay.txt','r',encoding="utf-8")#open函数默认已系统编码方式打开windo ...

  6. 2017ICPC南宁M The Maximum Unreachable Node Set (偏序集最长反链)

    题意:给你一张DAG,让你选取最多的点,使得这些点之间互相不可达. 思路:此问题和最小路径可重复点覆盖等价,先在原图上跑一边传递闭包,然后把每个点拆成两个点i, i + n, 原图中的边(a, b)变 ...

  7. java并发学习--第四章 JDK提供的线程原子性操作工具类

    在了解JDK提供的线程原子性操作工具类之前,我们应该先知道什么是原子性:在多线程并发的条件下,对于变量的操作是线程安全的,不会受到其他线程的干扰.接下来我们就学习JDK中线程的原子性操作. 一.CAS ...

  8. ivew 限制输入 0 到 1 的数字 包括小数, 0 ,1

    input <FormItem label="> <Input v-model="formItem.shapeDifferen.breastScaleOutSpa ...

  9. fiddler使用介绍

    Fiddler的详细介绍 Fiddler的详细介绍 一.Fiddler与其他抓包工具的区别 1.Firebug虽然可以抓包,但是对于分析http请求的详细信息,不够强大.模拟http请求的功能也不够, ...

  10. Nginx-配置动静分离实例

    Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离.严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx 处理静态页面,Tomcat处 ...