人傻自带大常数

二分的可行性证明:

贴近他的正确答案不会被当作次优解删掉,因为,若二分在他右边发生,那么二分一定会把左边作为优解,左边同理,所以他一定是被扣掉的所以最后一个小于等于一定是正确答案

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #define MAXN 1500005
  5. using namespace std;
  6. const double A=0.756;
  7. const int inf=;
  8. int n,m,a[];
  9. struct ScapeGoat_Tree
  10. {
  11. ScapeGoat_Tree *ch[];
  12. int ex,cover,size,key;
  13. bool bad()
  14. {
  15. return cover*A<ch[]->cover||cover*A<ch[]->cover;
  16. }
  17. void pushup()
  18. {
  19. size=ch[]->size+ch[]->size+ex;
  20. cover=ch[]->cover+ch[]->cover+;
  21. }
  22. }*null,pool[MAXN],*stack[MAXN],*lst[MAXN];
  23. int top,len;
  24. inline void Init()
  25. {
  26. null=pool;
  27. null->cover=null->size=null->ex=null->key=;
  28. null->ch[]=null->ch[]=null;
  29. for(int i=;i<MAXN;i++)stack[++top]=pool+i;
  30. }
  31. inline ScapeGoat_Tree *New(int key)
  32. {
  33. ScapeGoat_Tree *p=stack[top--];
  34. p->ch[]=p->ch[]=null;
  35. p->ex=p->cover=p->size=;
  36. p->key=key;
  37. return p;
  38. }
  39. struct Tree
  40. {
  41. Tree *ch[];
  42. int l,r,mid;
  43. ScapeGoat_Tree *root;
  44. Tree(){ch[]=ch[]=NULL;root=null;}
  45. void* operator new(size_t size);
  46. }*root,*C,*mempool;
  47. void* Tree :: operator new(size_t size)
  48. {
  49. if(C==mempool)
  50. {
  51. C=new Tree[(<<)+];
  52. mempool=C+(<<)+;
  53. }
  54. return C++;
  55. }
  56. void travel(ScapeGoat_Tree *p)
  57. {
  58. if(p==null)return;
  59. travel(p->ch[]);
  60. if(p->ex) lst[++len]=p;
  61. else stack[++top]=p;
  62. travel(p->ch[]);
  63. }
  64. ScapeGoat_Tree *divide(int l,int r)
  65. {
  66. if(l>r)return null;
  67. int mid=(l+r)>>;
  68. lst[mid]->ch[]=divide(l,mid-);
  69. lst[mid]->ch[]=divide(mid+,r);
  70. lst[mid]->pushup();
  71. return lst[mid];
  72. }
  73. ScapeGoat_Tree **insert(ScapeGoat_Tree *&p,int key)
  74. {
  75. if(p==null)
  76. {
  77. p=New(key);
  78. return &null;
  79. }
  80. p->size++;
  81. p->cover++;
  82. ScapeGoat_Tree **ret=insert(p->ch[p->key<=key],key);
  83. if(p->bad())ret=&p;
  84. return ret;
  85. }
  86. inline void rebuild(ScapeGoat_Tree *&p)
  87. {
  88. len=;
  89. travel(p);
  90. p=divide(,len);
  91. }
  92. inline void Insert(ScapeGoat_Tree *&Root,int key)
  93. {
  94. ScapeGoat_Tree **p=insert(Root,key);
  95. if(*p!=null)rebuild(*p);
  96. }
  97. inline int rank(ScapeGoat_Tree *p,int key)
  98. {
  99. int ret=;
  100. while(p!=null)
  101. if(p->key>=key)
  102. p=p->ch[];
  103. else
  104. ret+=p->ch[]->size+p->ex,p=p->ch[];
  105. return ret;
  106. }
  107. void erase(ScapeGoat_Tree *p,int k)
  108. {
  109. p->size--;
  110. if(p->ex&&k==p->ch[]->size+)
  111. {
  112. p->ex=;
  113. return;
  114. }
  115. if(p->ch[]->size>=k)
  116. erase(p->ch[],k);
  117. else erase(p->ch[],k-p->ch[]->size-p->ex);
  118. }
  119. inline void Erase_kth(ScapeGoat_Tree *&p,int k)
  120. {
  121. erase(p,k);
  122. if(p->size<p->cover*A)rebuild(p);
  123. }
  124. inline void Erase(ScapeGoat_Tree *&p,int key)
  125. {
  126. Erase_kth(p,rank(p,key)+);
  127. }
  128. void build(Tree *p)
  129. {
  130. p->mid=(p->l+p->r)>>;
  131. if(p->l==p->r)return;
  132. p->ch[]=new Tree;
  133. p->ch[]->l=p->l;
  134. p->ch[]->r=p->mid;
  135. p->ch[]=new Tree;
  136. p->ch[]->l=p->mid+;
  137. p->ch[]->r=p->r;
  138. build(p->ch[]);
  139. build(p->ch[]);
  140. }
  141. void get_in(int key,int aim,Tree *p)
  142. {
  143. Insert(p->root,key);
  144. if(p->l==p->r)return;
  145. if(aim<=p->mid)get_in(key,aim,p->ch[]);
  146. else get_in(key,aim,p->ch[]);
  147. }
  148. void get_rank(int l,int r,int key,Tree *p,int &ans)
  149. {
  150.  
  151. if(l<=p->l&&p->r<=r)
  152. {
  153. ans+=rank(p->root,key);
  154. return;
  155. }
  156. if(l<=p->mid)get_rank(l,r,key,p->ch[],ans);
  157. if(p->mid<r)get_rank(l,r,key,p->ch[],ans);
  158. }
  159. inline int Rank(int l,int r,int key)
  160. {
  161. int ans=;
  162. get_rank(l,r,key,root,ans);
  163. return ans+;
  164. }
  165. inline int Kth(int l,int r,int rk)
  166. {
  167. int z=,y=inf,mid;
  168. int ans=;
  169. while(z<=y)
  170. {
  171. mid=(z+y)>>;
  172. int k=Rank(l,r,mid);
  173. if(k<=rk)
  174. ans=mid,z=mid+;
  175. else
  176. y=mid-;
  177. }
  178. return ans;
  179. }
  180. void get_out(int aim,int key,Tree *p)
  181. {
  182. Erase(p->root,key);
  183. if(p->l==p->r)return;
  184. if(aim<=p->mid)get_out(aim,key,p->ch[]);
  185. else get_out(aim,key,p->ch[]);
  186. }
  187. inline void work1()
  188. {
  189. int l,r,k;
  190. scanf("%d%d%d",&l,&r,&k);
  191. printf("%d\n",Rank(l,r,k));
  192. }
  193. inline void work2()
  194. {
  195. int l,r,k;
  196. scanf("%d%d%d",&l,&r,&k);
  197. printf("%d\n",Kth(l,r,k));
  198. }
  199. inline void work3()
  200. {
  201. int aim,key;
  202. scanf("%d%d",&aim,&key);
  203. get_out(aim,a[aim],root);
  204. a[aim]=key;
  205. get_in(key,aim,root);
  206. }
  207. inline void work4()
  208. {
  209. int l,r,k;
  210. scanf("%d%d%d",&l,&r,&k);
  211. printf("%d\n",Kth(l,r,Rank(l,r,k)-));
  212. }
  213. inline void work5()
  214. {
  215. int l,r,k;
  216. scanf("%d%d%d",&l,&r,&k);
  217. printf("%d\n",Kth(l,r,Rank(l,r,k+)));
  218. }
  219. void dfs(Tree *p)
  220. {
  221. if(p->l==p->r)return;
  222. dfs(p->ch[]);
  223. dfs(p->ch[]);
  224. }
  225. int main()
  226. {
  227. freopen("psh.in","r",stdin);
  228. freopen("psh.out","w",stdout);
  229. Init();
  230. root=new Tree;
  231. root->l=;
  232. scanf("%d%d",&n,&m);
  233. root->r=n;
  234. build(root);
  235. dfs(root);
  236. for(int i=;i<=n;i++)
  237. {
  238. scanf("%d",&a[i]);
  239. get_in(a[i],i,root);
  240. }
  241. dfs(root);
  242. int opt;
  243. while(m--)
  244. {
  245. scanf("%d",&opt);
  246. switch(opt)
  247. {
  248. case :work1();break;
  249. case :work2();break;
  250. case :work3();break;
  251. case :work4();break;
  252. case :work5();break;
  253. }
  254. }
  255. return ;
  256. }

bzoj3196 [TYVJ1730]二逼平衡树 树套树 线段树套替罪羊树的更多相关文章

  1. BZOJ3196 Tyvj1730 二逼平衡树 【树套树】 【线段树套treap】

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

  2. [BZOJ3196][Tyvj1730]二逼平衡树

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

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

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

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

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

  5. bzoj3196:Tyvj1730二逼平衡树

    传送门 暴力啊,直接树套树上啊 线段树套splay,卡卡常就直接A了 代码: #include<cstdio> #include<iostream> #include<a ...

  6. 【BZOJ3196】二逼平衡树(树状数组,线段树)

    [BZOJ3196]二逼平衡树(树状数组,线段树) 题面 BZOJ题面 题解 如果不存在区间修改操作: 搞一个权值线段树 区间第K大--->直接在线段树上二分 某个数第几大--->查询一下 ...

  7. [TYVJ1730]二逼平衡树

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

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

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

  9. 【bzoj3196】 Tyvj1730—二逼平衡树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3196 (题目链接) 题意 1.查询k在区间内的排名:2.查询区间内排名为k的值:3.修改某一位值上的 ...

随机推荐

  1. JavaSE 第二次学习随笔(关于内存的小题)

    class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println(&quo ...

  2. 2.从print到自省

    print是一个函数   为什么print是一个函数呢?可以在交互式解释器下 输入: >>> type(print) 输出: <class 'builtin_function_ ...

  3. 007---logging日志模块

    logging模块 用途:服务器运行日志.运维日志... import logging from logging.handlers import RotatingFileHandler, TimedR ...

  4. git的基本操作总结

    参考链接 https://blog.csdn.net/u012661010/article/details/73433872 https://blog.csdn.net/shj_php/article ...

  5. Android面试收集录 Android组件

    1.请说出Android SDK支持哪些方式显示富文本信息? 使用TextView组件可以显示富文本信息,如果要实现图文混排,需实现ImageGetter接口 使用WebView组件显示HTML页面 ...

  6. OpenCV代码提取: threshold函数的实现

    threshold algorithm: The simplest image segmentation method. All thresholding algorithms take a sour ...

  7. error LNK2001: unresolved external symbol "public: __thiscall ControllerInterface::ControllerInterface(class QObject *)" (??0ControllerInterface@@QAE@PAVQObject@@@Z) downloadcontroller.obj

    前几天刚遇到这个问题,但是今天再碰到就又要思考怎么解决.这次特别记录一下,以防下次碰到再手足无措: 1.看到这个报错第一感觉LNK关键字,表示连接错误,这种错误有几个可以下手的点 1)函数声明和定义是 ...

  8. I/O Handler的管理(3)

    另外连接地址:http://blogs.readthedocs.org/zh_CN/latest/Handler_mgr.html 本章目录 I/O Handler的管理 IO句柄与Select_Re ...

  9. 贝叶斯网(1)尝试用Netica搭建简单的贝叶斯网并使用贝叶斯公式解释各个bar的结果

    近来对贝叶斯网十分感兴趣,按照博客<读懂概率图模型:你需要从基本概念和参数估计开始>给出的第一个例子,试着搭建了一个student网. (1)点击绿F,对条件概率表予以输入(包括两个祖先节 ...

  10. 相关系数之杰卡德相似系数(Jaccardsimilarity coefficient)

    杰卡德相似系数(Jaccardsimilarity coefficient) (1)杰卡德相似系数 两个集合A和B交集元素的个数在A.B并集中所占的比例,称为这两个集合的杰卡德系数,用符号 J(A,B ...