原题链接:http://www.tyvj.cn/p/1730

树套树。。。

如下:

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cstring>
  4 #include<algorithm>
  5 #define lc root<<1
  6 #define rc root<<1|1
  7 #define INF 0x3f3f3f3f
  8 #define _max(a,b) ((a)>(b)?(a):(b))
  9 #define _min(a,b) ((a)>(b)?(b):(a))
 10 const int Max_N = 50100;
 11 struct SBT *null;
 12 struct SBT{
 13     int v, s, c;
 14     SBT *ch[2];
 15     SBT(int _v = 0) : v(_v){
 16         c = s = 1;
 17         ch[0] = ch[1] = null;
 18     }
 19     inline void push_up(){
 20         s = ch[0]->s + ch[1]->s + c;
 21     }
 22     inline int cmp(int x) const{
 23         return v == x ? -1 : x > v;
 24     }
 25 }stack[Max_N << 5], *ptr[Max_N << 2];
 26 int sz = 0, sum = 0, arr[Max_N];
 27 void init(){
 28     null = &stack[sz++];
 29     null->s = null->c = 0;
 30 }
 31 inline void rotate(SBT* &x, int d){
 32     SBT *k = x->ch[!d];
 33     x->ch[!d] = k->ch[d];
 34     k->ch[d] = x;
 35     k->s = x->s;;
 36     x->push_up();
 37     x = k;
 38 }
 39 void Maintain(SBT* &x, int d){
 40     if (x->ch[d] == null) return;
 41     if (x->ch[d]->ch[d]->s > x->ch[!d]->s){
 42         rotate(x, !d);
 43     } else if (x->ch[d]->ch[!d]->s > x->ch[d]->s){
 44         rotate(x->ch[d], d), rotate(x, !d);
 45     } else {
 46         return;
 47     }
 48     Maintain(x, 0), Maintain(x, 1);
 49 }
 50 void insert(SBT* &x, int v){
 51     if (x == null){
 52         x = &stack[sz++];
 53         x->v = v;
 54         x->ch[0] = x->ch[1] = null;
 55     } else {
 56         x->s++;
 57         int d = x->cmp(v);
 58         if (-1 == d){
 59             x->c++;
 60             return;
 61         }
 62         insert(x->ch[d], v);
 63         x->push_up();
 64         Maintain(x, d);
 65     }
 66 }
 67 void del(SBT* &x, int v){
 68     if (x == null) return;
 69     int d = x->cmp(v);
 70     x->s--;
 71     if (-1 == d){
 72         if (x->c > 1){
 73             x->c--;
 74         } else if (x->ch[0] == null || x->ch[1] == null){
 75             x = x->ch[0] != null ? x->ch[0] : x->ch[1];
 76         } else {
 77             SBT *ret = x->ch[1];
 78             for (; ret->ch[0] != null; ret = ret->ch[0]);
 79             del(x->ch[1], x->v = ret->v);
 80         }
 81     } else {
 82         del(x->ch[d], v);
 83     }
 84     if (x != null) x->push_up();
 85 }
 86 int sbt_rank(SBT *x, int v){
 87     int t = 0, cur = 0;
 88     for (; x != null;){
 89         t = x->ch[0]->s;
 90         if (v == x->v) return cur + t;
 91         else if (v < x->v) x = x->ch[0];
 92         else cur += t + x->c, x = x->ch[1];
 93     }
 94     return cur;
 95 }
 96 int sbt_pred(SBT *x, int v){
 97     int t = -1;
 98     for (; x != null;){
 99         if (x->v < v){
100             t = x->v;
101             x = x->ch[1];
102         }
103         else x = x->ch[0];
104     }
105     return t == -1 ? -INF : t;
106 }
107 int sbt_succ(SBT *x, int v){
108     int t = -1;
109     for (; x != null;){
110         if (x->v > v){
111             t = x->v;
112             x = x->ch[0];
113         }
114         else x = x->ch[1];
115     }
116     return t == -1 ? INF : t;
117 }
118 void seg_built(int root, int l, int r){
119     ptr[root] = null;
120     for (int i = l; i <= r; i++) insert(ptr[root], arr[i]);
121     if (l == r) return;
122     int mid = (l + r) >> 1;
123     seg_built(lc, l, mid);
124     seg_built(rc, mid + 1, r);
125 }
126 void seg_rank(int root, int l, int r, int x, int y, int v){
127     if (x > r || y < l) return;
128     if (x <= l && y >= r){
129         sum += sbt_rank(ptr[root], v);
130         return;
131     }
132     int mid = (l + r) >> 1;
133     seg_rank(lc, l, mid, x, y, v);
134     seg_rank(rc, mid + 1, r, x, y, v);
135 }
136 void seg_modify(int root, int l, int r, int pos, int v){
137     if (pos > r || pos < l) return;
138     del(ptr[root], arr[pos]);
139     insert(ptr[root], v);
140     if (l == r) return;
141     int mid = (l + r) >> 1;
142     seg_modify(lc, l, mid, pos, v);
143     seg_modify(rc, mid + 1, r, pos, v);
144 }
145 int seg_pred(int root, int l, int r, int x, int y, int v){
146     if (x > r || y < l) return -INF;
147     if (x <= l && y >= r) return sbt_pred(ptr[root], v);
148     int mid = (l + r) >> 1;
149     int v1 = seg_pred(lc, l, mid, x, y, v);
150     int v2 = seg_pred(rc, mid + 1, r, x, y, v);
151     return _max(v1, v2);
152 }
153 int seg_succ(int root, int l, int r, int x, int y, int v){
154     if (x > r || y < l) return INF;
155     if (x <= l && y >= r) return sbt_succ(ptr[root], v);
156     int mid = (l + r) >> 1;
157     int v1 = seg_succ(lc, l, mid, x, y, v);
158     int v2 = seg_succ(rc, mid + 1, r, x, y, v);
159     return _min(v1, v2);
160 }
161 void gogo(int n, int a, int b, int k){
162     int mid, l = 0, r = 100000000;
163     while (l < r){
164         sum = 0;
165         mid = (l + r) >> 1;
166         seg_rank(1, 1, n, a, b, mid);
167         if (sum < k) l = mid + 1;
168         else r = mid;
169     }
170     printf("%d\n", l - 1);
171 }
172 int main(){
173 #ifdef LOCAL
174     freopen("in.txt", "r", stdin);
175     freopen("out.txt", "w+", stdout);
176 #endif
177     init();
178     int i, n, m, a, b, c, d;
179     scanf("%d %d", &n, &m);
180     for (i = 1; i <= n; i++) scanf("%d", &arr[i]);
181     seg_built(1, 1, n);
182     while (m--){
183         scanf("%d", &a);
184         switch (a){
185             case 1:
186                 sum = 1;
187                 scanf("%d %d %d", &b, &c, &d);
188                 seg_rank(1, 1, n, b, c, d);
189                 printf("%d\n",sum);
190                 break;
191             case 2:
192                 scanf("%d %d %d", &b, &c, &d);
193                 gogo(n, b, c, d);
194                 break;
195             case 3:
196                 scanf("%d %d", &b, &c);
197                 seg_modify(1, 1, n, b, c), arr[b] = c;
198                 break;
199             case 4:
200                 scanf("%d %d %d", &b, &c, &d);
201                 printf("%d\n", seg_pred(1, 1, n, b, c, d));
202                 break;
203             case 5:
204                 scanf("%d %d %d", &b, &c, &d);
205                 printf("%d\n", seg_succ(1, 1, n, b, c, d));
206                 break;
207         }
208     }
209     return 0;
210 } 

View Code

转载于:https://www.cnblogs.com/GadyPu/p/4450679.html

bzoj 3196/tyvj p1730 二逼平衡树相关推荐

  1. Bzoj 3196 Tyvj 1730 二逼平衡树

    3196: Tyvj 1730 二逼平衡树 >原题链接< Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...

  2. 【BZOJ3196】Tyvj 1730 二逼平衡树

    Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查询k在 ...

  3. 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2271  Solved: 935 [Submit][St ...

  4. 洛谷 P3380 bzoj3196 Tyvj1730 【模板】二逼平衡树(树套树)

    [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数值 查询k在 ...

  5. BZOJ3196 二逼平衡树 ZKW线段树套vector(滑稽)

    我实在是不想再打一遍树状数组套替罪羊树了... 然后在普通平衡树瞎逛的时候找到了以前看过vector题解 于是我想:为啥不把平衡树换成vector呢??? 然后我又去学了一下ZKW线段树 就用ZKW线 ...

  6. 【BZOJ3196】【Tyvj1730】二逼平衡树,第一次的树套树(线段树+splay)

    传送门1 传送门2 写在前面:创造迄今最长的正常代码的记录 思路:个人感觉这个树套树就是对线段树的每个区间建一棵splay来维护,最初觉得这个方法会爆T爆M--(实际上真的可能会爆).对于5个操作,我 ...

  7. 二逼平衡树——树套树(线段树套Splay平衡树)

    题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...

  8. [luogu3380][bzoj3196]【模板】二逼平衡树【树套树】

    题目地址 [洛谷传送门] 题目大意 区间查询k的排名,查找k排名的数,单点修改,区间前驱,区间后继. 感想 真的第一次写树套树,整个人都不对了.重构代码2次,发现样例都过不了,splay直接爆炸,可能 ...

  9. luogu P3380 【模板】二逼平衡树(树套树)

    恭喜你 以分块的姿势通过了此题 #include<cmath> #include<cstdio> #include<algorithm> #define inf ( ...

最新文章

  1. 对象检测和图像分割有什么区别?
  2. TypeError: Caught TypeError in DataLoader worker process 0.
  3. [LeetCode] Restore IP Addresses 复原IP地址
  4. Centos7+Mysql5.7实现主从复制
  5. Codeforces 1205C Palindromic Paths (交互题、DP)
  6. 使用Hibernate在CQRS读取模型中进行快速开发
  7. mysql5.7.18的安装与主从复制
  8. 关于Content-Type: multipart/form-data的支持
  9. 解决 ThinkPad x270 安装 ubuntu 14.04 后的网络问题
  10. 剑指:合并两个排序的链表
  11. Meta标签中的viewport属性及含义
  12. php 中文获取拼音,php获取中文的拼音代码_php
  13. oracle短表和长表的区别,人口普查长表哪些人填和短表有什么区别
  14. Doris 运维篇:Apache Doris 如何定位处理问题的Tablet
  15. 如何用c语言编辑定时关机程序有说明的,C语言编写的定时关机程序
  16. 关于阻容耦合电路及阻容耦合分压
  17. 小波变换第2讲:尺度函数与小波函数
  18. 究竟wifi是怎么定位我的
  19. 外贸独立站怎么提高转化率
  20. 【MaxCompute】MaxCompute 处理复杂json、json数组

热门文章

  1. 学习《css世界》笔记之使用overflow做文字溢出点点点效果
  2. 如何安装sshd服务用于远程登录
  3. 工作339:pc父组件通过props传值给子组件,如何避免子组件改变props的属性值报错问题
  4. 前端学习(2852):简单秒杀系统学习之鼠标点击方法
  5. 工作140:封装写法
  6. 前端学习(2379):加入git管理
  7. 前端学习(1331):mongoose第三方模块
  8. 前端学习(1044):本地存储实现数据录入
  9. 项目管理(2):管理过程二
  10. 第一百五十二期:白话Entity Framework Core数据验证