【题目分析】

全靠运气,卡空间。

xjb试几次就过了。

【代码】

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. #define maxn 200005
  9. #define mlog 16
  10. #define inf 0x3f3f3f3f
  11. #define maxm 4000005
  12. #define F(i,j,k) for (int i=j;i<=k;++i)
  13.  
  14. int ch[maxm][2],fa[maxm],siz[maxm],v[maxm],num[maxm],n,m,rt[maxn*5],a[maxn];
  15. int L,R,X,C,tot,Pre,Nxt,opt,ans,k,aim;
  16.  
  17. void update(int k)
  18. {siz[k]=siz[ch[k][0]]+siz[ch[k][1]]+num[k];}
  19.  
  20. int ins(int &k,int fat)
  21. {
  22. if (!k){k=++tot;num[k]=siz[k]=1;v[k]=C;fa[k]=fat;ch[k][0]=ch[k][1]=0;return k;}
  23. siz[k]++;
  24. if (C==v[k]) {num[k]++;return k;}
  25. else if (C<v[k]) return ins(ch[k][0],k);
  26. else return ins(ch[k][1],k);
  27. }
  28.  
  29. void rot(int x,int &k)
  30. {
  31. int y=fa[x],z=fa[y],l=0,r;
  32. if (ch[y][1]==x) l=1; r=l^1;
  33. if (y==k) k=x;
  34. else
  35. {
  36. if (ch[z][0]==y) ch[z][0]=x;
  37. else ch[z][1]=x;
  38. }
  39. fa[x]=z; fa[y]=x; fa[ch[x][r]]=y;
  40. ch[y][l]=ch[x][r]; ch[x][r]=y;
  41. update(y); update(x);
  42.  
  43. }
  44.  
  45. void splay(int x,int &k)
  46. {
  47. while (x!=k)
  48. {
  49. int y=fa[x],z=fa[y];
  50. if (y!=k)
  51. {
  52. if (ch[z][0]==y^ch[y][0]==x) rot(x,k);
  53. rot(y,k);
  54. }
  55. rot(x,k);
  56. }
  57. }
  58.  
  59. void add(int o,int l,int r)
  60. {
  61. int mid=l+r>>1;
  62. splay(ins(rt[o],0),rt[o]);
  63. if (l==r) return;
  64. if (X<=mid) add(o<<1,l,mid);
  65. else add(o<<1|1,mid+1,r);
  66. }
  67.  
  68. void qrk(int k)
  69. {
  70. if (!k) return;
  71. if (v[k]<C) {ans+=siz[ch[k][0]]+num[k];return qrk(ch[k][1]);}
  72. if (v[k]==C) {ans+=siz[ch[k][0]];return;}
  73. return qrk(ch[k][0]);
  74. }
  75.  
  76. void queryrk(int o,int l,int r)
  77. {
  78. if (L<=l&&r<=R){qrk(rt[o]);return;}
  79. int mid=l+r>>1;
  80. if (L<=mid) queryrk(o<<1,l,mid);
  81. if (R>mid) queryrk(o<<1|1,mid+1,r);
  82. }
  83.  
  84. void qpr(int k)
  85. {
  86. if (!k) return;
  87. if (v[k]>=C) return qpr(ch[k][0]);
  88. else{Pre=max(Pre,v[k]); return qpr(ch[k][1]);}
  89. }
  90.  
  91. void querypr(int o,int l,int r)
  92. {
  93. if (L<=l&&r<=R){qpr(rt[o]);return;}
  94. int mid=l+r>>1;
  95. if (L<=mid) querypr(o<<1,l,mid);
  96. if (R>mid) querypr(o<<1|1,mid+1,r);
  97. }
  98.  
  99. void qnt(int k)
  100. {
  101. if (!k) return;
  102. if (v[k]<=C) return qnt(ch[k][1]);
  103. else{Nxt=min(Nxt,v[k]); return qnt(ch[k][0]);}
  104. }
  105.  
  106. void querynt(int o,int l,int r)
  107. {
  108. if (L<=l&&r<=R){qnt(rt[o]);return;}
  109. int mid=l+r>>1;
  110. if (L<=mid) querynt(o<<1,l,mid);
  111. if (R>mid) querynt(o<<1|1,mid+1,r);
  112. }
  113.  
  114. void del(int &k)
  115. {
  116. if (v[k]==C)
  117. {
  118. if (num[k]>1)
  119. {
  120. num[k]--;
  121. siz[k]--;
  122. splay(k,rt[aim]);
  123. return ;
  124. }
  125. else
  126. {
  127. if (ch[k][0]*ch[k][1]==0)
  128. {
  129. if ((!ch[k][0])&&(!ch[k][1])) {k=0;return;}
  130. if (!ch[k][0]) fa[ch[k][1]]=fa[k];
  131. else fa[ch[k][0]]=fa[k];
  132. k=ch[k][0]+ch[k][1];
  133. return ;
  134. }
  135. else
  136. {
  137. int tmp=rand()%2;
  138. rot(ch[k][tmp],k);
  139. del(k);
  140. return ;
  141. }
  142. }
  143. }
  144. siz[k]--;
  145. if (v[k]<C) del(ch[k][1]);
  146. else del(ch[k][0]);
  147. }
  148.  
  149. void dec(int o,int l,int r)
  150. {
  151. int mid=(l+r)/2;aim=o;
  152. del(rt[o]);
  153. if (l==r) return ;
  154. if (X<=mid) dec(o<<1,l,mid);
  155. else dec(o<<1|1,mid+1,r);
  156. }
  157.  
  158. int main()
  159. {
  160. int l,r;
  161. // freopen("in.txt","r",stdin);
  162. scanf("%d%d",&n,&m);
  163. F(i,1,n)
  164. {
  165. scanf("%d",&a[i]);
  166. X=i; C=a[i];
  167. add(1,1,n);
  168. }
  169. F(i,1,m)
  170. {
  171. scanf("%d",&opt);
  172. switch(opt)
  173. {
  174. case 1:
  175. ans=0;
  176. scanf("%d%d%d",&L,&R,&C);
  177. queryrk(1,1,n);
  178. printf("%d\n",ans+1);
  179. break;
  180. case 2:
  181. scanf("%d%d%d",&L,&R,&k);
  182. l=-inf; r=inf;
  183. while (l<r)
  184. {
  185. int mid=(l+r)/2+1;
  186. C=mid; ans=0;
  187. queryrk(1,1,n);
  188. if (ans<=k-1) l=mid;
  189. else r=mid-1;
  190. }
  191. printf("%d\n",r);
  192. break;
  193. case 3:
  194. scanf("%d%d",&X,&k);
  195. C=a[X];
  196. dec(1,1,n);
  197. a[X]=k; C=a[X];
  198. add(1,1,n);
  199. break;
  200. case 4:
  201. Pre=-inf;
  202. scanf("%d%d%d",&L,&R,&C);
  203. querypr(1,1,n);
  204. printf("%d\n",Pre);
  205. break;
  206. case 5:
  207. Nxt=inf;
  208. scanf("%d%d%d",&L,&R,&C);
  209. querynt(1,1,n);
  210. printf("%d\n",Nxt);
  211. break;
  212. }
  213. }
  214. }

  

BZOJ 3196 二逼平衡树 ——树套树的更多相关文章

  1. bzoj 3196二逼平衡树 线段树套平衡树

    比较裸的树套树,对于区间K值bz上有一道裸题,详见题解http://www.cnblogs.com/BLADEVIL/p/3455336.html(其实题解也不是很详细) //By BLADEVIL ...

  2. BZOJ 3196 二逼平衡树

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

  3. bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1807  Solved: 772[Submit][Stat ...

  4. bzoj 3196/ Tyvj 1730 二逼平衡树 (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description ...

  5. BZOJ 3196 Tyvj 1730 二逼平衡树:线段树套splay

    传送门 题意 给你一个长度为 $ n $ 有序数列 $ a $ ,进行 $ m $ 次操作,操作有如下几种: 查询 $ k $ 在区间 $ [l,r] $ 内的排名 查询区间 $ [l,r] $ 内排 ...

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

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

  7. BZOJ3196 二逼平衡树 【线段树套平衡树】

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

  8. bzoj 3196 Tyvj 1730 二逼平衡树【线段树 套 splay】

    四舍五入就是个暴力. 对于线段树的每个区间都开一棵按权值排序的splay 对于第二个操作,二分一下,每次查询mid的排名,复杂度 $ O(nlog(n)^{3}) $ 其余的操作都是$ O(nlog( ...

  9. [BZOJ3196] [Tyvj1730] 二逼平衡树(线段树 套 Splay)

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

随机推荐

  1. dialog样式的activity设置activity的title为隐藏属性

    View view= this.findViewById(android.R.id.title);view.setVisibility(View.GONE);

  2. SQLServer查询耗时sql语句

    qs.total_worker_time/qs.execution_count as [Avg CPU Time], , ( ) as query_text, qt.dbid, dbname=db_n ...

  3. swift 接水果游戏ios源码

    初学swift,写来练手的,游戏很简单 ,顾名思义就是接水果 ,菠萝不能接,接到一个水果得一分,接到菠萝扣五分,漏一个水果扣一分,初始分0分,当分数低于0分 就Game Over了,暂时适用5s的模拟 ...

  4. (一)maven之创建一个maven项目

    为什么要使用Maven? 1.  maven使用的是本地仓库存储jar,所有项目都会共用仓库中的同一份jar. 2.  Spring core.jar必须同时引用版本兼容的common-logging ...

  5. ABC3D创客项目:国旗

    国旗是一个国家的象征,也是一个民族的骄傲,国旗带给人们的不仅是荣耀,更多的是爱国的情结.看一场天安门的升旗仪式一度成为广大游客去到北京的必有项目,看国旗仪仗队将五星红旗与太阳同时升起,象征着我国充满活 ...

  6. 迅为IMX6Q开发板在道路交通信号控制系统解决方案中的应用

    智能交通综合管控平台是为交通指挥系统服务的统一信息平台,以信息技术为主导,以计算机通信网络和智能化指挥控制管理为基础,建成集高新技术应用为一体的智能化指挥调度集成平台,实现信息交换与共享.快速反应决策 ...

  7. Objective-C中的命名前缀说明

    http://www.cnblogs.com/dhui69/p/6410134.html __kindof __kindof 这修饰符还是很实用的,解决了一个长期以来的小痛点,拿原来的 UITable ...

  8. python之路——递归函数

    阅读目录 楔子 初识递归 再谈递归 递归函数与三级菜单 递归函数与二分查找算法 楔子 在讲今天的内容之前,我们先来讲一个故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前 ...

  9. 参考别人的代码写的aes加密,记录一下(AES,ECB模式,填充PKCS5Padding,数据块128位,偏移量无,以hex16进制输出)

    package org.jimmy.autosearch2019.test; import java.security.SecureRandom; import javax.crypto.Cipher ...

  10. linux 用dd命令读写引导区文件

    分类: LINUX 备份MBR,linux下使用如下命令: # dd if=/dev/hda of=/root/linux.bin bs=512 count=1 这里注意使用if=/dev/hda备份 ...