bzoj3196 [TYVJ1730]二逼平衡树 树套树 线段树套替罪羊树
人傻自带大常数
二分的可行性证明:
贴近他的正确答案不会被当作次优解删掉,因为,若二分在他右边发生,那么二分一定会把左边作为优解,左边同理,所以他一定是被扣掉的所以最后一个小于等于一定是正确答案
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #define MAXN 1500005
- using namespace std;
- const double A=0.756;
- const int inf=;
- int n,m,a[];
- struct ScapeGoat_Tree
- {
- ScapeGoat_Tree *ch[];
- int ex,cover,size,key;
- bool bad()
- {
- return cover*A<ch[]->cover||cover*A<ch[]->cover;
- }
- void pushup()
- {
- size=ch[]->size+ch[]->size+ex;
- cover=ch[]->cover+ch[]->cover+;
- }
- }*null,pool[MAXN],*stack[MAXN],*lst[MAXN];
- int top,len;
- inline void Init()
- {
- null=pool;
- null->cover=null->size=null->ex=null->key=;
- null->ch[]=null->ch[]=null;
- for(int i=;i<MAXN;i++)stack[++top]=pool+i;
- }
- inline ScapeGoat_Tree *New(int key)
- {
- ScapeGoat_Tree *p=stack[top--];
- p->ch[]=p->ch[]=null;
- p->ex=p->cover=p->size=;
- p->key=key;
- return p;
- }
- struct Tree
- {
- Tree *ch[];
- int l,r,mid;
- ScapeGoat_Tree *root;
- Tree(){ch[]=ch[]=NULL;root=null;}
- void* operator new(size_t size);
- }*root,*C,*mempool;
- void* Tree :: operator new(size_t size)
- {
- if(C==mempool)
- {
- C=new Tree[(<<)+];
- mempool=C+(<<)+;
- }
- return C++;
- }
- void travel(ScapeGoat_Tree *p)
- {
- if(p==null)return;
- travel(p->ch[]);
- if(p->ex) lst[++len]=p;
- else stack[++top]=p;
- travel(p->ch[]);
- }
- ScapeGoat_Tree *divide(int l,int r)
- {
- if(l>r)return null;
- int mid=(l+r)>>;
- lst[mid]->ch[]=divide(l,mid-);
- lst[mid]->ch[]=divide(mid+,r);
- lst[mid]->pushup();
- return lst[mid];
- }
- ScapeGoat_Tree **insert(ScapeGoat_Tree *&p,int key)
- {
- if(p==null)
- {
- p=New(key);
- return &null;
- }
- p->size++;
- p->cover++;
- ScapeGoat_Tree **ret=insert(p->ch[p->key<=key],key);
- if(p->bad())ret=&p;
- return ret;
- }
- inline void rebuild(ScapeGoat_Tree *&p)
- {
- len=;
- travel(p);
- p=divide(,len);
- }
- inline void Insert(ScapeGoat_Tree *&Root,int key)
- {
- ScapeGoat_Tree **p=insert(Root,key);
- if(*p!=null)rebuild(*p);
- }
- inline int rank(ScapeGoat_Tree *p,int key)
- {
- int ret=;
- while(p!=null)
- if(p->key>=key)
- p=p->ch[];
- else
- ret+=p->ch[]->size+p->ex,p=p->ch[];
- return ret;
- }
- void erase(ScapeGoat_Tree *p,int k)
- {
- p->size--;
- if(p->ex&&k==p->ch[]->size+)
- {
- p->ex=;
- return;
- }
- if(p->ch[]->size>=k)
- erase(p->ch[],k);
- else erase(p->ch[],k-p->ch[]->size-p->ex);
- }
- inline void Erase_kth(ScapeGoat_Tree *&p,int k)
- {
- erase(p,k);
- if(p->size<p->cover*A)rebuild(p);
- }
- inline void Erase(ScapeGoat_Tree *&p,int key)
- {
- Erase_kth(p,rank(p,key)+);
- }
- void build(Tree *p)
- {
- p->mid=(p->l+p->r)>>;
- if(p->l==p->r)return;
- p->ch[]=new Tree;
- p->ch[]->l=p->l;
- p->ch[]->r=p->mid;
- p->ch[]=new Tree;
- p->ch[]->l=p->mid+;
- p->ch[]->r=p->r;
- build(p->ch[]);
- build(p->ch[]);
- }
- void get_in(int key,int aim,Tree *p)
- {
- Insert(p->root,key);
- if(p->l==p->r)return;
- if(aim<=p->mid)get_in(key,aim,p->ch[]);
- else get_in(key,aim,p->ch[]);
- }
- void get_rank(int l,int r,int key,Tree *p,int &ans)
- {
- if(l<=p->l&&p->r<=r)
- {
- ans+=rank(p->root,key);
- return;
- }
- if(l<=p->mid)get_rank(l,r,key,p->ch[],ans);
- if(p->mid<r)get_rank(l,r,key,p->ch[],ans);
- }
- inline int Rank(int l,int r,int key)
- {
- int ans=;
- get_rank(l,r,key,root,ans);
- return ans+;
- }
- inline int Kth(int l,int r,int rk)
- {
- int z=,y=inf,mid;
- int ans=;
- while(z<=y)
- {
- mid=(z+y)>>;
- int k=Rank(l,r,mid);
- if(k<=rk)
- ans=mid,z=mid+;
- else
- y=mid-;
- }
- return ans;
- }
- void get_out(int aim,int key,Tree *p)
- {
- Erase(p->root,key);
- if(p->l==p->r)return;
- if(aim<=p->mid)get_out(aim,key,p->ch[]);
- else get_out(aim,key,p->ch[]);
- }
- inline void work1()
- {
- int l,r,k;
- scanf("%d%d%d",&l,&r,&k);
- printf("%d\n",Rank(l,r,k));
- }
- inline void work2()
- {
- int l,r,k;
- scanf("%d%d%d",&l,&r,&k);
- printf("%d\n",Kth(l,r,k));
- }
- inline void work3()
- {
- int aim,key;
- scanf("%d%d",&aim,&key);
- get_out(aim,a[aim],root);
- a[aim]=key;
- get_in(key,aim,root);
- }
- inline void work4()
- {
- int l,r,k;
- scanf("%d%d%d",&l,&r,&k);
- printf("%d\n",Kth(l,r,Rank(l,r,k)-));
- }
- inline void work5()
- {
- int l,r,k;
- scanf("%d%d%d",&l,&r,&k);
- printf("%d\n",Kth(l,r,Rank(l,r,k+)));
- }
- void dfs(Tree *p)
- {
- if(p->l==p->r)return;
- dfs(p->ch[]);
- dfs(p->ch[]);
- }
- int main()
- {
- freopen("psh.in","r",stdin);
- freopen("psh.out","w",stdout);
- Init();
- root=new Tree;
- root->l=;
- scanf("%d%d",&n,&m);
- root->r=n;
- build(root);
- dfs(root);
- for(int i=;i<=n;i++)
- {
- scanf("%d",&a[i]);
- get_in(a[i],i,root);
- }
- dfs(root);
- int opt;
- while(m--)
- {
- scanf("%d",&opt);
- switch(opt)
- {
- case :work1();break;
- case :work2();break;
- case :work3();break;
- case :work4();break;
- case :work5();break;
- }
- }
- return ;
- }
bzoj3196 [TYVJ1730]二逼平衡树 树套树 线段树套替罪羊树的更多相关文章
- BZOJ3196 Tyvj1730 二逼平衡树 【树套树】 【线段树套treap】
BZOJ3196 Tyvj1730 二逼平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名 ...
- [BZOJ3196][Tyvj1730]二逼平衡树
[BZOJ3196][Tyvj1730]二逼平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询 \(k\) 在区间内的排名 查询区间内排名为 \ ...
- [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树
二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...
- [BZOJ3196] [Tyvj1730] 二逼平衡树(线段树 套 Splay)
传送门 至少BZOJ过了,其他的直接弃. 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的 ...
- bzoj3196:Tyvj1730二逼平衡树
传送门 暴力啊,直接树套树上啊 线段树套splay,卡卡常就直接A了 代码: #include<cstdio> #include<iostream> #include<a ...
- 【BZOJ3196】二逼平衡树(树状数组,线段树)
[BZOJ3196]二逼平衡树(树状数组,线段树) 题面 BZOJ题面 题解 如果不存在区间修改操作: 搞一个权值线段树 区间第K大--->直接在线段树上二分 某个数第几大--->查询一下 ...
- [TYVJ1730]二逼平衡树
[TYVJ1730]二逼平衡树 题目 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查 ...
- 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2271 Solved: 935[Submit][Stat ...
- 【bzoj3196】 Tyvj1730—二逼平衡树
http://www.lydsy.com/JudgeOnline/problem.php?id=3196 (题目链接) 题意 1.查询k在区间内的排名:2.查询区间内排名为k的值:3.修改某一位值上的 ...
随机推荐
- JavaSE 第二次学习随笔(关于内存的小题)
class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println(&quo ...
- 2.从print到自省
print是一个函数 为什么print是一个函数呢?可以在交互式解释器下 输入: >>> type(print) 输出: <class 'builtin_function_ ...
- 007---logging日志模块
logging模块 用途:服务器运行日志.运维日志... import logging from logging.handlers import RotatingFileHandler, TimedR ...
- git的基本操作总结
参考链接 https://blog.csdn.net/u012661010/article/details/73433872 https://blog.csdn.net/shj_php/article ...
- Android面试收集录 Android组件
1.请说出Android SDK支持哪些方式显示富文本信息? 使用TextView组件可以显示富文本信息,如果要实现图文混排,需实现ImageGetter接口 使用WebView组件显示HTML页面 ...
- OpenCV代码提取: threshold函数的实现
threshold algorithm: The simplest image segmentation method. All thresholding algorithms take a sour ...
- error LNK2001: unresolved external symbol "public: __thiscall ControllerInterface::ControllerInterface(class QObject *)" (??0ControllerInterface@@QAE@PAVQObject@@@Z) downloadcontroller.obj
前几天刚遇到这个问题,但是今天再碰到就又要思考怎么解决.这次特别记录一下,以防下次碰到再手足无措: 1.看到这个报错第一感觉LNK关键字,表示连接错误,这种错误有几个可以下手的点 1)函数声明和定义是 ...
- I/O Handler的管理(3)
另外连接地址:http://blogs.readthedocs.org/zh_CN/latest/Handler_mgr.html 本章目录 I/O Handler的管理 IO句柄与Select_Re ...
- 贝叶斯网(1)尝试用Netica搭建简单的贝叶斯网并使用贝叶斯公式解释各个bar的结果
近来对贝叶斯网十分感兴趣,按照博客<读懂概率图模型:你需要从基本概念和参数估计开始>给出的第一个例子,试着搭建了一个student网. (1)点击绿F,对条件概率表予以输入(包括两个祖先节 ...
- 相关系数之杰卡德相似系数(Jaccardsimilarity coefficient)
杰卡德相似系数(Jaccardsimilarity coefficient) (1)杰卡德相似系数 两个集合A和B交集元素的个数在A.B并集中所占的比例,称为这两个集合的杰卡德系数,用符号 J(A,B ...