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.修改某一位值上的 ...
随机推荐
- hadoop生态搭建(3节点)-07.hive配置
# http://archive.apache.org/dist/hive/hive-2.1.1/ # ================================================ ...
- (数据科学学习手札04)Python与R在自定义函数上的异同
自编函数是几乎每一种编程语言的基础功能,有些时候我们需要解决的问题可能没有完全一致的包中的函数来进行解决,这个时候自编函数就成了一样利器,而Python与R在这方面也有着一定的差别,下面举例说明: P ...
- [Python 3.X]python练习笔记[2]-----用python实现七段数码管显示年月日
#SevenDigitsDrawV2.py import turtle import time def drawGap(i):#绘制数码管间隔 turtle.penup() turtle.fd(i) ...
- 为什么说Objective-C是一门动态的语言?
object-c类的类型和数据变量的类型都是在运行是确定的,而不是在编译时确定.例如:多态特性,我们可以使用父类对象来指向子类对象,并且可以用来调用子类的方法.运行时(runtime)特性,我们可以动 ...
- 关于transition动画下,如果有fixed元素,渲染的奇葩问题
之前我们机票页面有生成一个低价日历,然后我们有一个需求就是滚动到那个月份,对应显示这个月,然后这个区域是fixed定位的,然后奇怪的事情发生了,就是低价日历的动画执行完后,修改页面的html却没有正常 ...
- MQTT 开源代理mosquitto的网络层封装相当sucks
最近学习MQTT协议,选择了当前比较流行的MQTT Broker “mosquitto”,但是在阅读代码过程中发现其网络底层库封装的相当差劲. 对于MQTT协议的变长头长度的读取上,基本上采取每次一个 ...
- Qt Qwdget 汽车仪表知识点拆解5 标题栏图标闪烁
先贴上效果图,注意,没有写逻辑,都是乱动的 看下最上面的部分,有一些仪表图标在闪烁,如果一个一个写,也是可以实现的,不过感觉要累死的节奏 这里我写了一个我自己的Label,完了把把这些QLabel提升 ...
- 初探Qt Opengl【1】
最近一直在学习Qt的opengl绘图,看到好多资源都是关于以前的旧版本的, 我将我这几天学的的部分关于opengl的做个总结,也希望对需要学习的人有一定的帮助 在我的学习中,我主要用到一下三个方法 # ...
- Spring实战第九章学习笔记————保护Web应用
保护Web应用 在这一章我们将使用切面技术来探索保护应用程序的方式.不过我们不必自己开发这些切面----我们将使用Spring Security,一种基于Spring AOP和Servlet规范的Fi ...
- ssh以bash登录的配置
因ssh登录时不会加载.bashrc而是加载.bash_profile,所以以ssh的默认登录不会是bash,只要在.bash_profile中添加以下代码即可: if [ -f ~/.bashrc ...