bzoj 3196/tyvj p1730 二逼平衡树

原题链接: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

观察者模式与Boost.Signals

1&#xff09; 观察者模式定义 略&#xff0c;各种设计模式的书上都有定义。 2&#xff09; 观察者模式一般实现 观察者模式一般实现&#xff0c;都是“被观察者”保存一个“观察者”的列表&#xff0c;循环这个列表来通知“观察者”。代码&#xff0c;其中使用了boost的智能…

Android获取最新发送短信的基本信息,没有之一

注册&#xff1a; getContentResolver().registerContentObserver( Uri.parse("content://sms"), true, new SmsObserver(this, new Handler())); 监听&#xff1a; //用于检测发出的短信 public class SmsObserver extends Conten…

联想android刷机教程,超详细的联想刷机教程~带你嘻刷刷

一、刷机是什么说到“刷机”&#xff0c;很多人可能会和“升级”混淆起来&#xff0c;其实升级和刷机并不是同一概念。通俗地讲&#xff0c;升级就是对手机内的软件或系统进行升级&#xff0c;比如很多厂商手机都支持的OTA空中在线升级。而刷机&#xff0c;则相当于就是重装系统…

我的github地址

我的github仓库地址 https://github.com/xutiantian/Test转载于:https://www.cnblogs.com/xuxiaomeng/p/4455850.html

多看 android6,多看阅读本地版

为您推荐&#xff1a;多看阅读《多看阅读本地版》是一款由多看科技倾情研发打造的海量优质完本小说免费在线阅读app软件&#xff0c;这款软件的功能非常的全面&#xff0c;操作性简单&#xff0c;上手起来非常的容易&#xff0c;在这款软件里&#xff0c;各位用户们将能够于此体…

UIProgressView-初识IOS

好几天没更新了&#xff0c;学的时候太紧&#xff0c;没时间复习了都。今天刚好有时间&#xff0c;多更几个。 今天复习的是UIProgressView,我们常见使用在修改某些属性的时候经常用到&#xff0c;比如透明度&#xff0c;今天我们介绍一个简单的使用例子 定义什么的&#xff0c…

android正则判断两个符号之间,Android字母、数字、字符任意两种组合正则验证

释放双眼&#xff0c;带上耳机&#xff0c;听听看~&#xff01;最近朋友有个用户名验证&#xff0c;要求字母、数字、字符任意两种组合即可&#xff0c;让我帮写个正则验证&#xff0c;现在正则验证如下&#xff1a;/*** 判断是否匹配正则** param regex 正则表达式* param inp…

android手机deviceowner,删除 androidDeviceOwnerWiFiConfiguration

删除 androidDeviceOwnerWiFiConfigurationDelete androidDeviceOwnerWiFiConfiguration2021/3/24本文内容命名空间&#xff1a;microsoft.graphNamespace: microsoft.graph重要提示&#xff1a; /beta 版本下的 Microsoft Graph API 可能会更改;不支持生产使用。Important: Mi…

浅谈0/1切换

前言:   做过GUI开发的同学, 都知晓双缓存机制. 其过程为先把所有的场景和实体对象画到一个备份canvas, 然后再把备份canvas的内容整个填充真正的画板canvas中. 如果不采用双缓存机制, 你的画面有可能会出现闪烁和抖动.   究其原因是整个绘制过程, 包含清屏, 绘制场景和各…

Action和Func区别

Action<>和Func<>其实都是委托的【代理】简写形式。 简单的委托写法&#xff1a; 1 //普通的委托2 public delegate void myDelegate(string str);3 4 //Delegate委托调。5 myDelegate dDelegate new myDelegate(SayHellow);6 dDelegate("Mr wang");7 8…

最好的android one手机,最高配置的Android One手机登场 LG推出G7 One与G7 F

原标题&#xff1a;最高配置的Android One手机登场 LG推出G7 One与G7 F集微网消息&#xff0c;Android One原本是谷歌与中国台湾的联发科共同开发的一个项目&#xff0c;旨在让手机制造商打造低成本的智能手机&#xff0c;这些手机主要是销售给新兴市场上的近10亿潜在用户。随着…

CAEmitterLayer 和 CAEmitterCell 粒子发射

CAEmitterLayer emitterCells&#xff1a;CAEmitterCell对象的数组&#xff0c;被用于把粒子投放到layer上 birthRate:可以通俗的理解为发射源的个数&#xff0c;默认1.0。当前每秒产生的真实粒子数为CAEmitterLayer的birthRate*子粒子的birthRate&#xff1b; lifetime emitte…

android 音量调节 seekbar,Android 使用SeekBar调节系统音量

以下是一个使用SeekBar来调节系统音量的实例&#xff1a;1、XML&#xff1a;android:id"id/sound"android:layout_width"150px"android:layout_height"10px"android:max"100"//设置拖动条最大值android:progress"10"//设置拖…

vs代码模板制作

VS2008代码模板制作 一&#xff0c;类模板制作&#xff1a; 路径&#xff1a;C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\ItemTemplatesCache\CSharp\Code\2052\Class.zip 操作&#xff1a;打开Class.cs文件&#xff0c;编辑内容如下&#xff1a; // <…

html语言文本框的符号,HTML中的文本框textarea标签

用来创建一个可以输入多行的文本框&#xff0c;此标志对用于标志对之间。具有以下属性&#xff1a;(1)onchange指定控件改变时要调用的函数(2)onfocus当控件接受焦点时要执行的函数(3)onblur当控件失去焦点时要执行的函数(4)onselect当控件内容被选中时要执行的函数(5)name这文…

pads导出坐标文件html,【教程】PADS如何导出SMT贴片机用的坐标文件

找到一个好办法&#xff0c;用wps的Excel软件的话&#xff0c;将脚本进行如下修改即可。修改前&#xff1a;Sub ExportToExcel (txt As String)FillClipboardDim xl As ObjectOn Error Resume NextSet xl GetObject(,"Excel.Application")On Error GoTo ExcelError …

avalon框架,简单的MVVM

今天我又要挑战一次一个高大上的公司了 但是看着jd有点忧伤了要求如下 基本要求&#xff1a;1、熟悉 HTML / CSS / JS 并有良好的代码风格&#xff1b;2、理解 Web 标准&#xff0c;语义化&#xff0c;可以解决主流浏览器及不同版本的兼容性问题&#xff1b;3、熟悉常见框架&am…

微信公众号里如何上传html,微信公众号怎么做表单,微信万能表单如何添加到公众号里...

微信的使用占据着大众的日常&#xff0c;而微信上的一些订单、预约、登记、投诉、反馈等功能都可以使用微信万能表单来实现&#xff0c;那么微信万能表单怎么做&#xff1f;下文带来微信公众号表单制作方法&#xff0c;方法很简单&#xff0c;需要的朋友一起看看吧。微信万能表…

GridView控件RowDataBound事件中获取列字段值的几种途径

前台&#xff1a; <asp:TemplateField HeaderText"充值总额|账号余额"><ItemTemplate><asp:Label ID"lblSurplusMoney" runat"server" Text""></asp:Label></ItemTemplate></asp:TemplateField> …