ƽ����
\(\tt{Treap}\)
&
\(\tt{Splay}\)
Ҽ.����
\(\tt{Treap}\)
�����˽�
\(\tt{BST}\)
�dz����õĶ������������ݿ��԰�������һ����
\(\dots\)
���ǣ����ǽ�
\(\tt{Tree}\)
��
\(\tt{heap}\)
(��) �ϲ����Ա�֤ƽ����
\(\log\)
����ȡ�
����أ����ǿ���ʹ����ת����ʵ��
K8He��ͼ
������Ϊ�������Ƿ��֣��������������˳��Ϊ
\(y
������
\(q\)
��������������������������ڱ���
\(p
��������Ȼ
\(q\)
Ҫ��Ϊ
\(p\)
���Ҷ��ӡ��Ǿ�ʣ��
\(x\)
�޼ҿɹ飬���Ƿ���
\(p
����ô
\(q\)
����������ʺϲ����ˡ�
���ǹ涨
\(0\)
������
\(1\)
����Ϊ�ң�����ͨ��
\(d\)
^
\(1\)
ʵ�ַ���ȡ����
һ��ģ�����һ���ڵ�
\(i\)
���������
\(d\)
�����ϵĶ���
\(s\)
����ȥ����ô
\(i\)
Ҫ��Ϊ
\(s\)
��
\(d\)
^
\(1\)
�����ϵĶ��ӣ�
\(s\)
����
\(d\)
^
\(1\)
�����ϵĶ���Ҫ��Ϊ
\(i\)
��
\(d\)
�����ϵĶ��ӡ�
void rotate(int &i,int d){
int s=t[i].son[d];
t[i].son[d]=t[s].son[d^1];
t[s].son[d^1]=i;
up(i),i=s,up(i);
return;
}
��ô����ʲôʱ�������ת�أ����ǵ�����˵��Ҫ���öѵ����ʣ���ô���Ƕ�ÿ���ڵ����һ�����ȼ�����������С���ѻ����Ѵ棬����ǰ������ѵ������ˣ��Ǿ���ת��
-
����������Ӹ������ܣ���Ҫע�ⲻ����ѵ�����ʱ��������ת��
void insert(int &i,int k){
if(!i){
i=++tot;
t[i].cnt=t[i].siz=1;
t[i].val=k,t[i].rd=rnd();
return;
}
t[i].siz++;
if(t[i].val==k){
++t[i].cnt;return;
}
int d=(t[i].valt[t[i].son[d]].rd) rotate(i,d);
return;
}
-
ɾ�����������ҽڵ㣬���ֻ��һ�����ӣ��ö����滻���������ö���������(��ȻҪ���������)��Ȼ��һֱ����ֱ��ʣһ�����ӻ��߳�ΪҶ�ӽڵ㡣
void del(int &i,int k){
if(!i) return;
if(t[i].val==k){
if(t[i].cnt>1){
--t[i].cnt,--t[i].siz;
return;
}
int d=(t[ls(i)].rd>t[rs(i)].rd);
if(!ls(i)||!rs(i)) i=ls(i)+rs(i);
else rotate(i,d),del(i,k);
return;
}
t[i].siz--;
int d=t[i].val
-
�����������������⼴�ɡ�
int rk(int i,int k){
if(!i) return 1;
if(t[i].val>k) return rk(ls(i),k);
if(t[i].val
-
���
\(k\)
��˼����߶���һ����
int kth(int i,int k){
while(1){
if(k<=t[ls(i)].siz) i=ls(i);
else if(k>t[ls(i)].siz+t[i].cnt)
k-=(t[ls(i)].siz+t[i].cnt),i=rs(i);
else return t[i].val;
}
}
-
ǰ����̣�����ͨ
\(\tt{BST}\)
һ����
int pre(int i,int k){
if(!i) return -1e8;
if(t[i].val>=k) return pre(ls(i),k);
return max(pre(rs(i),k),t[i].val);
}
int nex(int i,int k){
if(!i) return 1e8;
if(t[i].val<=k) return nex(rs(i),k);
return min(nex(ls(i),k),t[i].val);
}
���ڵ���
\(\tt{Treap}\)
������ֻ��Ҫ������ת�������ɣ��Ͼ������
\(\tt{Splay}\)
��Ҫ����������ؿ�����ת�����������ģ�
����FHQ�ô�
��࿴�����У�Ӧ�÷�Χ����
(���ӷ�װ�������ⵥ
��ͨƽ����
��)
��.����
\(\tt{FHQ\ Treap}\)
���ڵ���
\(\tt{Treap}\)
���ô�����չ���ܲ��࣬�������������µ�
\(\tt{FHQ\_ Treap}\)
���������񷶺�ǿ�����ģ�%%%%%%��
���϶�˵FHQ�ȵ��������⣬�ұ�ʾ������֮��ȷʵ�����⣬�����������(�ҿ���һ����Сʱ�ſ�������������fw)
����ôֱ������ ����
\(\tt{FHQ\_ Treap}\)
��ȻҲ��
\(\tt{Treap}\)
���Ǿ���һ���ģ�Ҳ�ǿ������ʣ����IJ�֮ͬ�������ڣ������������ǿ�
����+�ϲ�
����֤
\(\log\)
����ȡ�
����أ����ѷ�ʽ�����֣�һ���ǰ�Ȩֵ���ѣ���һ���ǰ���������С����:
-
����Ȩֵ���ѣ����罫��
\(i\)
Ϊ����ƽ�����ֳ�����ƽ���������ֱ���
\(x,y\)
��Ҫ����
\(x\)
��Ȩֵ��С�ڵ���
\(k\)
,ʣ����
\(y\)
������:
-
���
\(val(i)<=k\)
����ô
\(i\)
������������һ����С��
\(k\)
���϶���Ҫ����
\(x\)
�����
\(x=i\)
�������ݹ黮��
\(rs(i)\)
���ɡ�
-
����
\(i\)
������������һ��������
\(k\)
���϶���Ҫ����
\(y\)
�����
\(y=i\)
�������ݹ黮��
\(ls(i)\)
���ɡ�
ע��ȡ��ַ��
void split(int i,int k,int &x,int &y){
if(!i){x=y=0;return;}
if(val(i)>k) y=i,split(ls(i),k,x,ls(i));
if(val(i)<=k) x=i,split(rs(i),k,rs(i),y);
up(i);return;
}
-
����������С���ѣ����ǽ���
\(i\)
Ϊ����ƽ�����ֳ�����ƽ���������ֱ���
\(x,y\)
��Ҫ����
\(siz(x)=k\)
�����Ǻ�����һ��:
-
���
\(siz(ls(i))+cnt(i)<=k\)
����ô
\(i\)
��������������
\(i\)
�϶���Ҫ����
\(x\)
�����
\(x=i\)
�������ݹ黮��
\(rs(i)\)
���ɡ�
-
����
\(i\)
�������������϶���Ҫ����
\(y\)
�����
\(y=i\)
�������ݹ黮��
\(ls(i)\)
���ɡ�
��������С���ѣ�һ������ƽ����ά�����У������
\(\tt{Splay}\)
Ҳ��һ����
void split(int i,int k,int &x,int &y){
if(!i){x=y=0;return;}
if(siz(ls(i))+cnt(i)<=k) x=i,split(rs(i),k-(siz(ls(i))+cnt(i)),rs(i),y);
else y=i,split(ls(i),k,x,ls(i));
up(i);
}
-
��һ�������Ǻϲ���
\(\tt{FHQ\_ Treap}\)
����ͨ������֤�Ķ����ʣ���Ҫ�ϲ����������ĸ��ֱ�Ϊ
\(x,y\)
���������Ϊ����ѡ�
-
��
\(rd(x)>rd(y)\)
���
\(x\)
��Ϊ����Ȼ������ݹ�ϲ�
\(rs(x)\)
��
\(y\)
-
�����
\(y\)
��Ϊ����Ȼ������ݹ�ϲ�
\(x\)
��
\(ls(y)\)
void merge(int &i,int x,int y){
if(!x||!y){i=x|y;return;}
if(rd(x)>rd(y)) merge(rs(x),rs(x),y),i=x;
else merge(ls(y),x,ls(y)),i=y;
up(i);return;
}
-
����
\(k\)
���ȷ��ѳ�
\(<=k-1\)
���ϲ�ʱ��
\(k\)
�ϲ���ȥ��
void insert(int k){
int rt1,rt2;
split(rt,k-1,rt1,rt2);
merge(rt,rt1,New(k));merge(rt,rt,rt2);
return;
}
-
ɾ��
\(k\)
����
\(k\)
���ѳ�����Ȼ���
\(k\)
���������������ϲ�������ٺϲ���
void del(int k){
int rt1,rt2,cut;
split(rt,k-1,rt1,rt2);split(rt2,k,cut,rt2);
merge(cut,ls(cut),rs(cut));
merge(rt,rt1,cut);merge(rt,rt,rt2);
return;
}
-
��������������
\(\leq k-1\)
������С
\(+1\)
int rk(int i,int k){
int rt1,rt2,res;
split(i,k-1,rt1,rt2);
res=siz(rt1)+1;
merge(i,rt1,rt2);
return res;
}
-
��
\(k\)
С������ͨ
\(\tt{Treap}\)
һ����
-
ǰ����̣���ǰ��Ϊ�������ѳ�
\(\leq k-1\)
����ô�ⲿ�ֶ�С��
\(k\)
���ҳ����ֵ���ɣ�һֱ���Ҷ��ӣ����ͬ����
int pre(int &i,int k){
int rt1,rt2,res;
split(i,k-1,rt1,rt2),res=rt1;
while(rs(res)) res=rs(res);
merge(i,rt1,rt2);
return val(res);
}
int nxt(int &i,int k){
int rt1,rt2,res;
split(i,k,rt1,rt2),res=rt2;
while(ls(res)) res=ls(res);
merge(i,rt1,rt2);
return val(res);
}
(���ӷ�װ�������ⵥ
��ͨƽ����
��)
��.˫��
\(\tt{Splay}\)
\(\tt{Splay}\)
��ͬ����������
\(\tt{Treap}\)
��������������������ȼ���֤��ȣ�����ͨ��������ת���ﵽĿ�ġ�
�����ڵ�����ֻ���������ǽ�ij�ڵ�Ķ�������������
\(\tt{Splay}\)
�ǽ�ij�ڵ���������ȥ��������ת��
\(\tt{Treap}\)
һ��������Ҫ���¼һ������
����أ���ת
\(x\)
ʱ����
\(y\)
Ϊ
\(x\)
�ĸ��ף�
\(z\)
Ϊ�游����
\(x\)
Ϊ
\(y\)
��
\(d\)
�����ϵĶ��ӣ��򵥴���ת�ɷ�Ϊ�⼸��:
-
\(x\)
�滻
\(y\)
��Ϊ
\(z\)
����
-
\(x\)
��
\(d\)
^
\(1\)
����Ķ����·Ÿ�
\(y\)
��
\(d\)
�������
-
\(y\)
�䵱
\(x\)
��
\(d\)
^
\(1\)
�������
�����޸ģ������ϵ���
rotate
�����
#define ds(i) t[i].son[d]
#define bs(i) t[i].son[d^1]
void rotate(int x){
int y=fa(x),z=fa(y);
int d=(rs(y)==x);
t[z].son[(rs(z)==y)]=x;fa(x)=z;
ds(y)=bs(x);fa(bs(x))=y;
bs(x)=y;fa(y)=x;
up(y),up(x);
}
Ȼ�����
\(\tt{Splay}\)
��IJ�����
splay
��˵
����أ�
splay
�����ǽ��ڵ�
\(x\)
��ת��Ŀ��ڵ�
\(s\)
�Ķ��ӣ���
\(s=0\)
��Ϊ��ת��������ô�������һֱһֱ������ȥ�Ļ����ǻᷢ��һ�����ص����⡪����Ȼ
\(x\)
��ȥ�ˣ�����������������Ȼû�䣬Ҳ����˵��ת�˸���į����
��ô��ô�죬����˫�������ۼ����������(
\(x,y,z\)
����ͬ��)
�����������������ܱ�֤���OK��ÿ�β���ڵ��Ҫ����һ��
Splay
void splay(int x,int s){
while(fa(x)!=s){
int y=fa(x),z=fa(y);
if(z!=s)
(ls(y)==x)^(ls(z)==y)?rotate(x):rotate(y);
rotate(x);
}
if(!s) rt=x;
}
������ô��Ϊʲô�����ø��Ӷ�OK��ʹ��ʲô
"���ܷ�����"
������fw�Ҳ��ᡣ
\(\tt{Splay}\)
��
\(\tt{FHQ}\)
һ����Ҳ������ά����ʽ��һ��ά��Ȩֵ��һ��ά���±�(�����е��������)��
Ȼ�����
\(\tt{Splay}\)
��һЩ��������:
-
���룬�����ַ�ʽ������Ȩֵ��������С����
\(\tt{FHQ}\)
���ƣ�ע��Ҫ��¼һ�¸��׽ڵ�
-
����Ȩֵ����
void insert(int k){
int p=rt,f=0;
while(p&&val(p)!=k){
f=p;
p=t[p].son[val(p)
-
����������С���룬���Եݹ�д(��զдզд)
void insert(int &i,int f,int x,int k){
if(!i){
i=++tot;
siz(i)=1;fa(i)=f;val(i)=k;
return;
}
if(x<=siz(ls(i))+1) insert(ls(i),i,x,k);
else insert(rs(i),i,x-siz(ls(i))-1,k);
up(i);
}
-
����
splay
������Ҫ���ҵ�ijȨֵ��Ӧ�Ľڵ㣬ֱ����Ȼ��
splay
void find(int k){
if(!rt) return;
int p=rt;
while(t[p].son[val(p)
void find(int x){
if(!rt) return;
int p=rt;
while(siz(ls(p))+1!=x){
if(x<=siz(ls(p))+1){
p=ls(p);
}
else{
x-=(siz(ls(p))+1);
p=rs(p);
}
}
splay(p,0);
}
-
���
\(k\)
����
\(\tt{Treap}\)
ͬ��������׸��
-
��������ת�����ڵ���������Ĵ�С
\(+1\)
����
-
��ǰ����̣���ǰ��Ϊ����ת����֮�������������ֵ��ǰ�������ͬ��
-
ɾ���Ƚ�����˼���������ҵ�ǰ����̣�Ȼ��ǰ��
splay
�����������
splay
��ǰ�����Ҷ��ӣ���ôҪɾ���Ľڵ��һ��Ϊ
\(ls(rs(rt))\)
(����ͼ)����Ҳ����ζ�ű�����ǰ����̣�����ɾ���ˣ���ôֱ�Ӳ���������ֵ�ڱ��ڵ㼴�ɡ�
pre
/ \
... nxt
/ \
cut ...
void del(int k){
int prek=pre(k);
int nxtk=nxt(k);
splay(prek,0);splay(nxtk,prek);
int cut=ls(nxtk);
if(cnt(cut)>1)
--cnt(cut),splay(cut,0);
else ls(nxtk)=0;
}
���⣬ά�����е�
\(\tt{Splay}\)
�����������ʱ��Ҳ�ǽ�����ת��Ϊ����,��ɾ���������ƣ�����
����ƽ����
��������������׸����
���ע��һ��Ҫ���ڱ�
(���ӷ�װ�������ⵥ
��ͨƽ����
��)
��.
\(hs\)
�ⵥ
\(T_D\)
��ͨƽ����
�����Ǵ����ӣ������ȹ�
\(T_D\)
��
��ͨTreap
#include
using namespace std;
#define read read()
#define pt puts("")
inline int read{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return f*x;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
#define N 100010
int m;
namespace TREAP{
mt19937 rnd(0x7f);
struct Treap{
int son[2],cnt,siz,val,rd;
#define ls(i) t[i].son[0]
#define rs(i) t[i].son[1]
}t[N];
int tot,rt;
void up(int i){
t[i].siz=t[ls(i)].siz+t[rs(i)].siz+t[i].cnt;
}
void rotate(int &i,int d){
int s=t[i].son[d];
t[i].son[d]=t[s].son[d^1];
t[s].son[d^1]=i;
up(i),i=s,up(i);
return;
}
void insert(int &i,int k){
if(!i){
i=++tot;
t[i].cnt=t[i].siz=1;
t[i].val=k,t[i].rd=rnd();
return;
}
t[i].siz++;
if(t[i].val==k){
++t[i].cnt;return;
}
int d=(t[i].valt[t[i].son[d]].rd) rotate(i,d);
return;
}
void del(int &i,int k){
if(!i) return;
if(t[i].val==k){
if(t[i].cnt>1){
--t[i].cnt,--t[i].siz;
return;
}
int d=(t[ls(i)].rd>t[rs(i)].rd);
if(!ls(i)||!rs(i)) i=ls(i)+rs(i);
else rotate(i,d),del(i,k);
return;
}
t[i].siz--;
int d=t[i].valk) return rk(ls(i),k);
if(t[i].valt[ls(i)].siz+t[i].cnt)
k-=(t[ls(i)].siz+t[i].cnt),i=rs(i);
else return t[i].val;
}
}
int pre(int i,int k){
if(!i) return -1e8;
if(t[i].val>=k) return pre(ls(i),k);
return max(pre(rs(i),k),t[i].val);
}
int nex(int i,int k){
if(!i) return 1e8;
if(t[i].val<=k) return nex(rs(i),k);
return min(nex(ls(i),k),t[i].val);
}
} using namespace TREAP;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("lty.in","r",stdin);
freopen("lty.out","w",stdout);
#endif
m=read;
int op,x;
while(m-->0){
op=read,x=read;
switch(op){
case 1:
insert(rt,x);break;
case 2:
del(rt,x);break;
case 3:
write(rk(rt,x));pt;break;
case 4:
write(kth(rt,x));pt;break;
case 5:
write(pre(rt,x));pt;break;
case 6:
write(nex(rt,x));pt;break;
}
}
return 0;
}
FHQ_Treap
#include
using namespace std;
#define read read()
#define pt puts("")
inline int read{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return f*x;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
const int N=1e5+10;
namespace FHQ_TREAP{
struct Treap{
int son[2],rd,cnt,siz,val;
#define ls(i) t[i].son[0]
#define rs(i) t[i].son[1]
#define rd(i) t[i].rd
#define cnt(i) t[i].cnt
#define siz(i) t[i].siz
#define val(i) t[i].val
}t[N];
int tot,rt;
void up(int i){
siz(i)=cnt(i)+siz(ls(i))+siz(rs(i));
}
int New(int k){
val(++tot)=k;
cnt(tot)=siz(tot)=1;
rd(tot)=rand();
return tot;
}
void split(int i,int k,int &x,int &y){
if(!i){x=y=0;return;}
if(val(i)>k) y=i,split(ls(i),k,x,ls(i));
if(val(i)<=k) x=i,split(rs(i),k,rs(i),y);
up(i);return;
}
void merge(int &i,int x,int y){
if(!x||!y){i=x|y;return;}
if(rd(x)>rd(y)) merge(rs(x),rs(x),y),i=x;
else merge(ls(y),x,ls(y)),i=y;
up(i);return;
}
void insert(int k){
int rt1,rt2;
split(rt,k-1,rt1,rt2);
merge(rt,rt1,New(k));merge(rt,rt,rt2);
return;
}
void del(int k){
int rt1,rt2,cut;
split(rt,k-1,rt1,rt2);split(rt2,k,cut,rt2);
merge(cut,ls(cut),rs(cut));
merge(rt,rt1,cut);merge(rt,rt,rt2);
return;
}
int rk(int i,int k){
int rt1,rt2,res;
split(i,k-1,rt1,rt2);
res=siz(rt1)+1;
merge(i,rt1,rt2);
return res;
}
int kth(int i,int k){
while(1){
if(k<=siz(ls(i))) i=ls(i);
else if(k>siz(ls(i))+cnt(i))
k-=(siz(ls(i))+cnt(i)),i=rs(i);
else return val(i);
}
}
int pre(int &i,int k){
int rt1,rt2,res;
split(i,k-1,rt1,rt2),res=rt1;
while(rs(res)) res=rs(res);
merge(i,rt1,rt2);
return val(res);
}
int nxt(int &i,int k){
int rt1,rt2,res;
split(i,k,rt1,rt2),res=rt2;
while(ls(res)) res=ls(res);
merge(i,rt1,rt2);
return val(res);
}
} using namespace FHQ_TREAP;
int m;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("lty.in","r",stdin);
freopen("lty.out","w",stdout);
#endif
srand(time(0));
m=read;
int op,x;
while(m-->0){
op=read,x=read;
switch(op){
case 1:
insert(x);
break;
case 2:
del(x);
break;
case 3:
write(rk(rt,x));pt;
break;
case 4:
write(kth(rt,x));pt;
break;
case 5:
write(pre(rt,x));pt;
break;
case 6:
write(nxt(rt,x));pt;
break;
default:break;
}
}
return 0;
}
Splay
#include
using namespace std;
#define read read()
#define pt puts("")
inline int read{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return f*x;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
const int N = 1e5+10;
int n;
namespace SPLAY{
struct Splay_Tree{
int son[2],fa,cnt,siz,val;
#define ls(i) t[i].son[0]
#define rs(i) t[i].son[1]
#define ds(i) t[i].son[d]
#define bs(i) t[i].son[d^1]
#define fa(i) t[i].fa
#define cnt(i) t[i].cnt
#define siz(i) t[i].siz
#define val(i) t[i].val
}t[N];
int tot,rt;
void up(int i){
siz(i)=siz(ls(i))+siz(rs(i))+cnt(i);
}
void rotate(int x){
int y=fa(x),z=fa(y);
int d=(rs(y)==x);
t[z].son[(rs(z)==y)]=x;fa(x)=z;
ds(y)=bs(x);fa(bs(x))=y;
bs(x)=y;fa(y)=x;
up(y),up(x);
}
void splay(int x,int s){
while(fa(x)!=s){
int y=fa(x),z=fa(y);
if(z!=s)
(ls(y)==x)^(ls(z)==y)?rotate(x):rotate(y);
rotate(x);
}
if(!s) rt=x;
}
void find(int k){
if(!rt) return;
int p=rt;
while(t[p].son[val(p)k) return p;
p=rs(p);while(ls(p)) p=ls(p);
return p;
}
void del(int k){
int prek=pre(k);
int nxtk=nxt(k);
splay(prek,0);splay(nxtk,prek);
int cut=ls(nxtk);
if(cnt(cut)>1)
--cnt(cut),splay(cut,0);
else ls(nxtk)=0;
}
int kth(int k){
int i=rt;
if(siz(i)siz(ls(i))+cnt(i))
k-=(siz(ls(i))+cnt(i)),i=rs(i);
else return val(i);
}
}
} using namespace SPLAY;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("lty.in","r",stdin);
freopen("lty.out","w",stdout);
#endif
n=read;
insert(-1e8);insert(1e8);
int op,x;
for(int i=1;i<=n;i++){
op=read,x=read;
switch(op){
case 1:
insert(x);break;
case 2:
del(x);break;
case 3:
find(x);
write(siz(ls(rt))),pt;break;
case 4:
write(kth(x+1)),pt;break;
case 5:
write(val(pre(x))),pt;break;
case 6:
write(val(nxt(x))),pt;break;
default:
break;
}
}
return 0;
}
\(T_A\)
Ӫҵ��ͳ��
���ӣ���ǰ����̡�
��ͨTreap
#include
using namespace std;
#define inf 1e10
#define int long long
#define read read()
#define pt puts("")
inline int read{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return f*x;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
const int N=(1<<15)+10;
int n;
int a;
int ans;
namespace TREAP{
mt19937 Rand(0x7f);
int tot,rt;
struct Treap{
int son[2],val,rd;
#define ls(i) t[i].son[0]
#define rs(i) t[i].son[1]
#define val(i) t[i].val
#define rd(i) t[i].rd
}t[N];
void rotate(int &i,int d){
int s=t[i].son[d];
t[i].son[d]=t[s].son[d^1];
t[s].son[d^1]=i;
i=s;
return;
}
void insert(int &i,int k){
if(!i){
i=++tot;
val(i)=k;rd(i)=Rand();
return;
}
if(val(i)==k){
return;
}
int d=(val(i)rd(t[i].son[d])) rotate(i,d);
}
int pre(int i,int k){
if(!i) return -inf;
if(val(i)>k) return pre(ls(i),k);
return max(val(i),pre(rs(i),k));
}
int nxt(int i,int k){
if(!i) return inf;
if(val(i)
FHQ_Treap
#include
using namespace std;
#define int long long
#define read read()
#define pt puts("")
inline int read{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return f*x;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
const int N = (1<<15)+10;
namespace FHQ_TREAP{
mt19937 Rand(0x7f);
struct Treap{
int son[2],rd,cnt,siz,val;
#define ls(i) t[i].son[0]
#define rs(i) t[i].son[1]
#define ds(i) t[i].son[d]
#define rd(i) t[i].rd
#define cnt(i) t[i].cnt
#define siz(i) t[i].siz
#define val(i) t[i].val
}t[N];
int tot,rt;
void up(int i){
siz(i)=cnt(i)+siz(ls(i))+siz(rs(i));
}
int New(int k){
val(++tot)=k;
cnt(tot)=siz(tot)=1;
rd(tot)=Rand();
return tot;
}
void split(int i,int k,int &x,int &y){
if(!i){x=y=0;return;}
if(val(i)>k) y=i,split(ls(i),k,x,ls(i));
if(val(i)<=k) x=i,split(rs(i),k,rs(i),y);
up(i);
}
void merge(int &i,int x,int y){
if(!x||!y){i=x|y;return;}
if(rd(x)>rd(y)) merge(rs(x),rs(x),y),i=x;
else merge(ls(y),x,ls(y)),i=y;
up(i);
}
void insert(int k){
int rt1,rt2;
split(rt,k-1,rt1,rt2);
merge(rt,rt1,New(k));
merge(rt,rt,rt2);
}
int pre(int k){
int rt1,rt2;
split(rt,k,rt1,rt2);
if(!siz(rt1)) return -1e8;
int res=rt1;
while(rs(res)) res=rs(res);
merge(rt,rt1,rt2);
return val(res);
}
int nxt(int k){
int rt1,rt2;
split(rt,k-1,rt1,rt2);
if(!siz(rt2)) return 1e8;
int res=rt2;
while(ls(res)) res=ls(res);
merge(rt,rt1,rt2);
return val(res);
}
} using namespace FHQ_TREAP;
int n,a;
int ans;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("lty.in","r",stdin);
freopen("lty.out","w",stdout);
#endif
n=read;
a=read;
insert(a);
ans=a;
for(int i=2;i<=n;i++){
a=read;
int prea=pre(a);
int nxta=nxt(a);
ans+=min(a-prea,nxta-a);
insert(a);
}
write(ans);
return 0;
}
Splay
#include
using namespace std;
#define read read()
#define pt puts("")
inline int read{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return f*x;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
const int N = 1e5+10;
int n;
namespace SPLAY{
struct Splay_Tree{
int son[2],fa,cnt,siz,val;
#define ls(i) t[i].son[0]
#define rs(i) t[i].son[1]
#define ds(i) t[i].son[d]
#define bs(i) t[i].son[d^1]
#define fa(i) t[i].fa
#define cnt(i) t[i].cnt
#define siz(i) t[i].siz
#define val(i) t[i].val
}t[N];
int tot,rt;
void up(int i){
siz(i)=siz(ls(i))+siz(rs(i))+cnt(i);
}
void rotate(int x){
int y=fa(x),z=fa(y);
int d=(rs(y)==x);
t[z].son[(rs(z)==y)]=x;fa(x)=z;
ds(y)=bs(x);fa(bs(x))=y;
bs(x)=y;fa(y)=x;
up(y),up(x);
}
void splay(int x,int s){
while(fa(x)!=s){
int y=fa(x),z=fa(y);
if(z!=s)
(ls(y)==x)^(ls(z)==y)?rotate(x):rotate(y);
rotate(x);
}
if(!s) rt=x;
}
void find(int k){
if(!rt) return;
int p=rt;
while(t[p].son[val(p)=k) return p;
p=rs(p);while(ls(p)) p=ls(p);
return p;
}
} using namespace SPLAY;
int a,ans;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("lty.in","r",stdin);
freopen("lty.out","w",stdout);
#endif
n=read;
insert(-1e8);insert(1e8);
a=read;
ans=a;
insert(a);
for(int i=2;i<=n;i++){
a=read;
int prea=val(pre(a)),nxta=val(nxt(a));
ans+=min(a-prea,nxta-a);
insert(a);
}
write(ans);
return 0;
}
\(T_B\)
����������
����ijʱ�̵�ƽ������ֻ��ȫ���˻���ȫ�ǹ�����ǰ����̼��ɣ����꼴ɾ��
��ͨTreap
#include
using namespace std;
#define int long long
#define inf 1e10
#define read read()
#define pt puts("")
inline int read{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return f*x;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
const int N=8*1e4+10;
const int p=1e6;
int n;
namespace TREAP{
mt19937 Rand(0x7f);
struct Treap{
int son[2],cnt,siz,val,rd;
#define ls(i) t[i].son[0]
#define rs(i) t[i].son[1]
#define cnt(i) t[i].cnt
#define siz(i) t[i].siz
#define val(i) t[i].val
#define rd(i) t[i].rd
}t[N];
int tot,rt;
void up(int i){
siz(i)=siz(ls(i))+siz(rs(i))+cnt(i);
}
void rotate(int &i,int d){
int s=t[i].son[d];
t[i].son[d]=t[s].son[d^1];
t[s].son[d^1]=i;
up(i),i=s,up(i);
return;
}
void insert(int &i,int k){
if(!i){
i=++tot;
cnt(i)=siz(i)=1;
val(i)=k;rd(i)=Rand();
return;
}
siz(i)++;
if(val(i)==k){
cnt(i)++;return;
}
int d=(val(i)rd(t[i].son[d])) rotate(i,d);
return;
}
void del(int &i,int k){
if(!i) return;
if(val(i)==k){
if(cnt(i)>1){
--cnt(i),--siz(i);
return;
}
int d=(rd(ls(i))>rd(rs(i)));
if(!ls(i)||!rs(i)) i=ls(i)+rs(i);
else rotate(i,d),del(i,k);
return;
}
int d=(val(i)k) return pre(ls(i),k);
return max(val(i),pre(rs(i),k));
}
int nxt(int i,int k){
if(!i) return inf;
if(val(i)
Splay
#include
using namespace std;
#define int long long
#define inf 1e10
#define read read()
#define pt puts("")
inline int read{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return f*x;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
const int N = 8*1e4+10;
const int p = 1e6;
int n;
namespace SPLAY{
struct Splay_Tree{
int son[2],fa,cnt,siz,val;
#define ls(i) t[i].son[0]
#define rs(i) t[i].son[1]
#define ds(i) t[i].son[d]
#define bs(i) t[i].son[d^1]
#define fa(i) t[i].fa
#define cnt(i) t[i].cnt
#define siz(i) t[i].siz
#define val(i) t[i].val
}t[N];
int tot,rt;
void up(int i){
siz(i)=siz(ls(i))+siz(rs(i))+cnt(i);
}
void rotate(int x){
int y=fa(x),z=fa(y);
int d=(rs(y)==x);
t[z].son[(rs(z)==y)]=x;fa(x)=z;
ds(y)=bs(x);fa(bs(x))=y;
bs(x)=y;fa(y)=x;
up(y),up(x);
}
void splay(int x,int s){
while(fa(x)!=s){
int y=fa(x),z=fa(y);
if(z!=s)
(ls(y)==x)^(ls(z)==y)?rotate(x):rotate(y);
rotate(x);
}
if(!s) rt=x;
}
void insert(int k){
int p=rt,f=0;
while(p && val(p)!=k){
f=p;
p=t[p].son[val(p)k) return p;
p=rs(p);while(ls(p)) p=ls(p);
return p;
}
void del(int k){
int prek=pre(k,0),nxtk=nxt(k,0);
splay(prek,0);splay(nxtk,prek);
int cut=ls(nxtk);
if(cnt(cut)>1) --cnt(cut),splay(cut,0);
else ls(nxtk)=0;
}
}
using namespace SPLAY;
bool now;
int num[2];
int a,b;
int ans;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("lty.in","r",stdin);
freopen("lty.out","w",stdout);
#endif
insert(-inf);insert(inf);
n=read;
now=read;b=read;num[now]=1;
insert(b);
for(int i=2;i<=n;i++){
a=read,b=read;
if(!num[a^1]){
++num[a],now=a;
insert(b);
continue;
}
if(a==now){
++num[now];
insert(b);
}
else{
int preb=val(pre(b,1)),nxtb=val(nxt(b,1));
int hwr=(b-preb<=nxtb-b?preb:nxtb);
ans=(ans+abs(hwr-b))%p;
del(hwr);
--num[now];
}
}
write(ans);
return 0;
}
ע��
\(Splay\)
��ǰ�����ʱ
���Ҫȡ��ע������
��ɾ��ʱ����ȡ��(ȡ�Ⱦͼ���)
\(T_C\)
���Ƶij���Ա
ά����������ǣ�ÿ��ɾ������
\(minn-add\)
�ߵġ�
-
����ͨ
\(\tt{Treap}\)
ֱ�ӱ���ɾ�����ô�
-
��
\(\tt{FHQ\_ Treap}\)
���ѳ�����
\(minn-add\)
�IJ��֣�ֱ�Ӳ�Ҫ���ɡ�
���ˣ�
\(\tt{FHQ\_ Treap}\)
�ܲ�����ͨ
\(\tt{Treap}\)
�ı���������
��ͨTreap
#include
using namespace std;
#define read read()
#define pt puts("")
inline int read{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return f*x;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
const int N = 1e6;
int n,minn;
int add;
int ans,sum;
int num;
namespace TREAP{
mt19937 rnd(0x7f);
struct Treap{
int son[2],cnt,siz,val,rd;
#define ls(i) t[i].son[0]
#define rs(i) t[i].son[1]
#define val(i) t[i].val
#define cnt(i) t[i].cnt
#define siz(i) t[i].siz
}t[N];
int tot,rt;
void up(int i){
t[i].siz=t[ls(i)].siz+t[rs(i)].siz+t[i].cnt;
}
void rotate(int &i,int d){
int s=t[i].son[d];
t[i].son[d]=t[s].son[d^1];
t[s].son[d^1]=i;
up(i),i=s,up(i);
return;
}
void insert(int &i,int k){
if(!i){
i=++tot;
t[i].cnt=t[i].siz=1;
t[i].val=k,t[i].rd=rnd();
return;
}
t[i].siz++;
if(t[i].val==k){
++t[i].cnt;return;
}
int d=(t[i].valt[t[i].son[d]].rd) rotate(i,d);
return;
}
void del(int &i,int k){
if(!i) return;
if(t[i].val==k){
if(t[i].cnt>1){
--t[i].cnt,--t[i].siz;
return;
}
int d=(t[ls(i)].rd>t[rs(i)].rd);
if(!ls(i)||!rs(i)) i=ls(i)+rs(i);
else rotate(i,d),del(i,k);
return;
}
t[i].siz--;
int d=(t[i].valk) return rk(ls(i),k);
if(t[i].valt[ls(i)].siz+t[i].cnt)
k-=(t[ls(i)].siz+t[i].cnt),i=rs(i);
else return t[i].val;
}
}
void dfs(int x){
if(ls(x)) dfs(ls(x));
if(rs(x)) dfs(rs(x));
if(minn-add>val(x)){
int c=cnt(x);
for(int i=1;i<=c;i++)
del(rt,val(x));
}
}
} using namespace TREAP;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("lty.in","r",stdin);
freopen("lty.out","w",stdout);
#endif
n=read,minn=read;
char op;
int k;
for(int i=1;i<=n;i++){
cin>>op;k=read;
switch (op){
case 'I':
if(k>=minn) insert(rt,k-add),++num;
break;
case 'A':
add+=k;
break;
case 'S':
add-=k;
dfs(rt);
break;
case 'F':
if(siz(rt)
FHQ_Treap
#include
using namespace std;
#define read read()
#define pt puts("")
inline int read{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return f*x;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
const int N = 1e5+10;
int n,minn,add;
namespace FHQ_TREAP{
mt19937 Rand(0x7f);
struct Treap{
int son[2],rd,cnt,siz,val;
#define ls(i) t[i].son[0]
#define rs(i) t[i].son[1]
#define ds(i) t[i].son[d]
#define rd(i) t[i].rd
#define cnt(i) t[i].cnt
#define siz(i) t[i].siz
#define val(i) t[i].val
}t[N];
int tot,rt;
void up(int i){
siz(i)=siz(ls(i))+siz(rs(i))+cnt(i);
}
int New(int k){
val(++tot)=k;
siz(tot)=cnt(tot)=1;
rd(tot)=Rand();
return tot;
}
void spilt(int i,int k,int &x,int &y){
if(!i){x=y=0;return;}
if(val(i)>k) y=i,spilt(ls(i),k,x,ls(i));
if(val(i)<=k) x=i,spilt(rs(i),k,rs(i),y);
up(i);
}
void merge(int &i,int x,int y){
if(!x||!y){i=x|y;return;}
if(rd(x)>rd(y)) merge(rs(x),rs(x),y),i=x;
else merge(ls(y),x,ls(y)),i=y;
up(i);
}
void insert(int k){
int rt1,rt2;
spilt(rt,k-1,rt1,rt2);
merge(rt,rt1,New(k));
merge(rt,rt,rt2);
return;
}
void del(int k){
int rt1,rt2;
spilt(rt,k-1,rt1,rt2);
rt=rt2;
}
int kth(int i,int k){
while(1){
if(k<=siz(ls(i))) i=ls(i);
else if(k>siz(ls(i))+cnt(i))
k-=(siz(ls(i))+cnt(i)),i=rs(i);
else return val(i);
}
}
} using namespace FHQ_TREAP;
int sum,ans;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("lty.in","r",stdin);
freopen("lty.out","w",stdout);
#endif
n=read,minn=read;
char op;
int k;
for(int i=1;i<=n;i++){
cin>>op;k=read;
switch(op){
case 'I':
if(k>=minn)
insert(k-add),++sum;
break;
case 'A':
add+=k;
break;
case 'S':
add-=k;
del(minn-add);
break;
case 'F':
if(siz(rt)
\(T_E\)
����ƽ����
ƽ�����������ж����������Ĺ��ܣ�ͬ������֧��������������������е��±�����ƽ���������������������Ô���У�Ȼ�����������͸���~
�������ä·×ªï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î¬ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç£ï¿½ï¿½Â·ï¿½Ê±ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ò¶ï¿½ï¿½Ó£ï¿½ï¿½Ö±ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ã¿ï¿½ï¿½ï¿½Úµï¿½ï¿½Öµï¿½ï¿½
���ڴ�����ǣ����ѳ�
\([l,r]\)
���֣�һ��Ҫ�ȷֳ�ǰ
\(r\)
�����ٷ�ǰ
\(l-1\)
��������������ȷ�ǰ
\(l-1\)
���������Ӧ�÷ֳ�
\(r-l+1\)
�����ֻ�һ�¾�֪��Ϊʲô�ˡ�
����ʹ��
\(\tt{FHQ\_ Treap}\)
ʱ�����ǰ�������С���з��ѣ���Ϊ�����ǰ����±꽨���������ܰ�Ȩֵ���ѡ�
FHQ_Treap
#include
using namespace std;
#define swap(x,y) (x^=y,y^=x,x^=y)
#define read read()
#define pt puts("")
inline int read{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return f*x;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
const int N = 1e5+10;
int n,m;
namespace FHQ_TREAP{
struct Treap{
int son[2],val,cnt,siz,rd,lazy;
#define ls(i) t[i].son[0]
#define rs(i) t[i].son[1]
#define rd(i) t[i].rd
#define cnt(i) t[i].cnt
#define siz(i) t[i].siz
#define val(i) t[i].val
#define lazy(i) t[i].lazy
}t[N];
int tot,rt;
int New(int k){
val(++tot)=k;
cnt(tot)=siz(tot)=1;
rd(tot)=rand();
return tot;
}
void up(int i){
siz(i)=siz(ls(i))+siz(rs(i))+cnt(i);
}
void down(int i){
if(!lazy(i)) return;
swap(ls(i),rs(i));
lazy(ls(i))^=1;
lazy(rs(i))^=1;
lazy(i)=0;
}
void split(int i,int k,int &x,int &y){
if(!i){x=y=0;return;}
down(i);
if(siz(ls(i))+cnt(i)<=k) x=i,split(rs(i),k-(siz(ls(i))+cnt(i)),rs(i),y);
else y=i,split(ls(i),k,x,ls(i));
up(i);
}
void merge(int &i,int x,int y){
if(!x||!y){i=x|y;return;}
if(rd(x)>rd(y)) down(x),merge(rs(x),rs(x),y),i=x;
else down(y),merge(ls(y),x,ls(y)),i=y;
up(i);
}
void insert(int k){
int rt1,rt2;
split(rt,k,rt1,rt2);
merge(rt,rt1,New(k));
merge(rt,rt,rt2);
}
void out(int i){
down(i);
if(ls(i)) out(ls(i));
write(val(i));putchar(' ');
if(rs(i)) out(rs(i));
}
} using namespace FHQ_TREAP;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("lty.in","r",stdin);
freopen("lty.out","w",stdout);
#endif
srand(time(0));
n=read,m=read;
for(int i=1;i<=n;i++) insert(i);
int l,r,rt1,rt2,rt3;
for(int i=1;i<=m;i++){
l=read,r=read;
rt1=rt2=rt3=0;
split(rt,r,rt1,rt3);
split(rt1,l-1,rt1,rt2);
lazy(rt2)^=1;
merge(rt1,rt1,rt2);
merge(rt,rt1,rt3);
// split(rt,l-1,rt1,rt2);
// split(rt2,r-l+1,rt2,rt3);
// lazy(rt2)^=1;
// merge(rt2,rt2,rt3);
// merge(rt,rt1,rt2);
}
out(rt);
return 0;
}
����
\(\tt{Splay}\)
����ʵ�Dz��ģ����Ƕ��ǽ�����ת��һ�������Ͻ��д��ǣ�������ɾ�����������ǽ�
\(l-1\)
ת��������
\(r+1\)
ת�����Ķ��ӣ���ô
\(ls(rs(rt))\)
��������������
\([l,r]\)
��Ȼ���
\(\tt{FHQ}\)
һ����
�ҵĴ���Ƚ��ų�
\(0\)
�������Ҹɴཫ����
\(+1\)
������
\(-1\)
�����
Splay
#include
using namespace std;
#define swap(x,y) (x^=y,y^=x,x^=y)
#define read read()
#define pt puts("")
inline int read{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return f*x;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
const int N = 1e5+10;
int n,m;
namespace SPLAY{
struct Splay_Tree{
int son[2],fa,lazy,siz,val;
#define ls(i) t[i].son[0]
#define rs(i) t[i].son[1]
#define ds(i) t[i].son[d]
#define bs(i) t[i].son[d^1]
#define fa(i) t[i].fa
#define lazy(i) t[i].lazy
#define siz(i) t[i].siz
#define val(i) t[i].val
}t[N];
int tot,rt;
void up(int i){
siz(i)=siz(ls(i))+siz(rs(i))+1;
}
void down(int i){
if(!lazy(i)) return;
lazy(i)=0;
swap(ls(i),rs(i));
lazy(ls(i))^=1,lazy(rs(i))^=1;
}
void rotate(int x){
int y=fa(x),z=fa(y);
int d=(rs(y)==x);
t[z].son[rs(z)==y]=x;fa(x)=z;
ds(y)=bs(x);fa(bs(x))=y;
bs(x)=y;fa(y)=x;
up(y),up(x);
}
void splay(int x,int s){
while(fa(x)!=s){
down(x);
int y=fa(x),z=fa(y);
if(z!=s)
(ls(y)==x)^(ls(z)==y)?rotate(x):rotate(y);
rotate(x);
}
if(!s) rt=x;
}
int find(int k){
if(!rt) return 0;
int p=rt;
while(siz(ls(p))+1!=k){
if(k<=siz(ls(p)))
p=ls(p);
else{
k-=(siz(ls(p))+1);
p=rs(p);
}
down(p);
}
return p;
}
void insert(int &i,int f,int x,int k){
if(!i){
i=++tot;
siz(i)=1;fa(i)=f;val(i)=k;
return;
}
if(x<=siz(ls(i))+1) insert(ls(i),i,x,k);
else insert(rs(i),i,x-siz(ls(i))-1,k);
up(i);
}
void out(int i){
down(i);
if(ls(i)) out(ls(i));
if(val(i)>1&&val(i)<=n+1)
write(val(i)-1),putchar(' ');
if(rs(i)) out(rs(i));
}
} using namespace SPLAY;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("lty.in","r",stdin);
freopen("lty.out","w",stdout);
#endif
n=read,m=read;
insert(rt,0,1,1);
for(int i=1;i<=n;i++){
insert(rt,0,i+1,i+1);
splay(tot,0);
}
insert(rt,0,n+2,n+2);
int l,r;
for(int i=1;i<=m;i++){
l=read+1,r=read+1;
splay(find(l-1),0);
splay(find(r+1),rt);
int p=ls(rs(rt));
lazy(p)^=1;
}
out(rt);
return 0;
}
\(T_F\)
����ƽ����
�߶�����ƽ�������ӡ�
-
���Ƚ�����ͨ�߶���������ÿ�����佨һ��ƽ������
-
����
\(x\)
������������ת���ɲ��������ڱ���С�����ĸ�����
\(1\)
��������
-
���ڵ�
\(k\)
С�������Ƕ��֣�ͨ������
\(1\)
���
-
�����޸�ֱ�ӴӸ��ڵ��ܵ�Ҷ�ӣ�·����ÿ���ڵ㶼Ҫɾ��Ô��������������ע��Ҫ�޸�Ô����
-
ǰ�����ֱ�ӷֱ��������ÿ��С���䣬ȡ��ֵ���ɡ�
������д�ѵ���ֻ���� FHQ_Treap
FHQ_Treap
#include
using namespace std;
#define read read()
#define pt puts("")
inline int read{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return f*x;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
const int N = 5*1e4+10;
const int inf = 2147483647;
int n,a[N],m;
int MIN=inf,MAX=-inf;
namespace FHQ_TREAP{
struct Treap{
int son[2],rd,cnt,siz,val;
#define ls(i) t[i].son[0]
#define rs(i) t[i].son[1]
#define rd(i) t[i].rd
#define cnt(i) t[i].cnt
#define siz(i) t[i].siz
#define val(i) t[i].val
}t[N<<6];
int tot;
void up(int i){
siz(i)=siz(ls(i))+siz(rs(i))+cnt(i);
}
int New(int k){
val(++tot)=k;
siz(tot)=cnt(tot)=1;
rd(tot)=rand();
return tot;
}
void split(int i,int k,int &x,int &y){
if(!i){x=y=0;return;}
if(val(i)<=k) x=i,split(rs(i),k,rs(i),y);
else y=i,split(ls(i),k,x,ls(i));
up(i);
}
void merge(int &i,int x,int y){
if(!x||!y){i=x|y;return;}
if(rd(x)>rd(y)) merge(rs(x),rs(x),y),i=x;
else merge(ls(y),x,ls(y)),i=y;
up(i);
}
void insert(int &rt,int k){
int rt1,rt2;
split(rt,k-1,rt1,rt2);
merge(rt,rt1,New(k));
merge(rt,rt,rt2);
}
void del(int &rt,int k){
int rt1,rt2,cut;
split(rt,k,rt1,rt2);
split(rt1,k-1,rt1,cut);
merge(cut,ls(cut),rs(cut));
merge(rt1,rt1,cut);
merge(rt,rt1,rt2);
}
int sumless(int rt,int k){
int rt1,rt2;
split(rt,k-1,rt1,rt2);
int res=siz(rt1);
merge(rt,rt1,rt2);
return res;
}
int pre(int rt,int k){
int rt1,rt2;
split(rt,k-1,rt1,rt2);
if(!siz(rt1)) return -inf;
int res=rt1;
while(rs(res)) res=rs(res);
merge(rt,rt1,rt2);
return val(res);
}
int nxt(int rt,int k){
int rt1,rt2;
split(rt,k,rt1,rt2);
if(!siz(rt2)) return inf;
int res=rt2;
while(ls(res)) res=ls(res);
merge(rt,rt1,rt2);
return val(res);
}
#undef ls
#undef rs
};
using namespace FHQ_TREAP;
namespace Segment_Tree{
struct SegTree{
int l,r,rt;
#define l(i) tr[i].l
#define r(i) tr[i].r
#define rt(i) tr[i].rt
#define ls(i) (i<<1)
#define rs(i) (i<<1|1)
}tr[N<<2];
void build(int i,int l,int r){
l(i)=l,r(i)=r;
for(int k=l;k<=r;k++){
insert(rt(i),a[k]);
}
if(l==r) return;
int mid=(l+r)>>1;
build(ls(i),l,mid);
build(rs(i),mid+1,r);
}
int lessk(int i,int ql,int qr,int k){
int l=l(i),r=r(i);
if(ql<=l&&r<=qr){
return sumless(rt(i),k);
}
int mid=(l+r)>>1,res=0;
if(ql<=mid) res+=lessk(ls(i),ql,qr,k);
if(mid>1;
if(q_rk(ql,qr,mid)<=k)
res=mid,st=mid+1;
else ed=mid-1;
}
return res;
}
void modify(int i,int x,int k){
del(rt(i),a[x]);
insert(rt(i),k);
int l=l(i),r=r(i);
if(l==r) return;
int mid=(l+r)>>1;
if(x<=mid) modify(ls(i),x,k);
else modify(rs(i),x,k);
}
int q_pre(int i,int ql,int qr,int k){
int l=l(i),r=r(i);
if(ql<=l&&r<=qr){
return pre(rt(i),k);
}
int mid=(l+r)>>1,res=-inf;
if(ql<=mid) res=max(res,q_pre(ls(i),ql,qr,k));
if(mid>1,res=inf;
if(ql<=mid) res=min(res,q_nxt(ls(i),ql,qr,k));
if(mid0){
op=read;
switch(op){
case 1:
l=read,r=read,x=read;
write(q_rk(l,r,x)),pt;break;
case 2:
l=read,r=read,x=read;
write(q_kth(l,r,x)),pt;break;
case 3:
l=read,x=read;//��Ҫ�����޸�Ô����
modify(1,l,x);a[l]=x;break;
case 4:
l=read,r=read,x=read;
write(q_pre(1,l,r,x)),pt;break;
case 5:
l=read,r=read,x=read;
write(q_nxt(1,l,r,x)),pt;break;
default:break;
}
}
return 0;
}
���ˣ��������̫ǿ���ҵij���Ҳ̫ǿ�󣬲��ò�д��ɢ������
FHQ_Treap+��ɢ��
#include
#define getchar() getchar_unlocked()
using namespace std;
#define read read()
#define pt puts("")
inline int read{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return f*x;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
const int N = 5*1e4+10;
const int inf = 2147483647;
int n,a[N],m;
int MIN=inf,MAX=-inf;
int lsh[N<<1],num,tt;
int op[N];
int l[N],r[N],x[N];
int ans[N],total;
namespace FHQ_TREAP{
struct Treap{
int son[2],rd,cnt,siz,val;
#define ls(i) t[i].son[0]
#define rs(i) t[i].son[1]
#define rd(i) t[i].rd
#define cnt(i) t[i].cnt
#define siz(i) t[i].siz
#define val(i) t[i].val
}t[N<<6];
int tot;
void up(int i){
siz(i)=siz(ls(i))+siz(rs(i))+cnt(i);
}
int New(int k){
val(++tot)=k;
siz(tot)=cnt(tot)=1;
rd(tot)=rand();
return tot;
}
void split(int i,int k,int &x,int &y){
if(!i){x=y=0;return;}
if(val(i)<=k) x=i,split(rs(i),k,rs(i),y);
else y=i,split(ls(i),k,x,ls(i));
up(i);
}
void merge(int &i,int x,int y){
if(!x||!y){i=x|y;return;}
if(rd(x)>rd(y)) merge(rs(x),rs(x),y),i=x;
else merge(ls(y),x,ls(y)),i=y;
up(i);
}
void insert(int &rt,int k){
int rt1,rt2;
split(rt,k-1,rt1,rt2);
merge(rt,rt1,New(k));
merge(rt,rt,rt2);
}
void del(int &rt,int k){
int rt1,rt2,cut;
split(rt,k,rt1,rt2);
split(rt1,k-1,rt1,cut);
merge(cut,ls(cut),rs(cut));
merge(rt1,rt1,cut);
merge(rt,rt1,rt2);
}
int sumless(int rt,int k){
int rt1,rt2;
split(rt,k-1,rt1,rt2);
int res=siz(rt1);
merge(rt,rt1,rt2);
return res;
}
int pre(int rt,int k){
int rt1,rt2;
split(rt,k-1,rt1,rt2);
if(!siz(rt1)) return -inf;
int res=rt1;
while(rs(res)) res=rs(res);
merge(rt,rt1,rt2);
return val(res);
}
int nxt(int rt,int k){
int rt1,rt2;
split(rt,k,rt1,rt2);
if(!siz(rt2)) return inf;
int res=rt2;
while(ls(res)) res=ls(res);
merge(rt,rt1,rt2);
return val(res);
}
#undef ls
#undef rs
};
using namespace FHQ_TREAP;
namespace Segment_Tree{
struct SegTree{
int l,r,rt;
#define l(i) tr[i].l
#define r(i) tr[i].r
#define rt(i) tr[i].rt
#define ls(i) (i<<1)
#define rs(i) (i<<1|1)
}tr[N<<2];
void build(int i,int l,int r){
l(i)=l,r(i)=r;
for(int k=l;k<=r;k++){
insert(rt(i),a[k]);
}
if(l==r) return;
int mid=(l+r)>>1;
build(ls(i),l,mid);
build(rs(i),mid+1,r);
}
int lessk(int i,int ql,int qr,int k){
int l=l(i),r=r(i);
if(ql<=l&&r<=qr){
return sumless(rt(i),k);
}
int mid=(l+r)>>1,res=0;
if(ql<=mid) res+=lessk(ls(i),ql,qr,k);
if(mid>1;
if(q_rk(ql,qr,mid)<=k)
res=mid,st=mid+1;
else ed=mid-1;
}
return res;
}
void modify(int i,int x,int k){
del(rt(i),a[x]);
insert(rt(i),k);
int l=l(i),r=r(i);
if(l==r) return;
int mid=(l+r)>>1;
if(x<=mid) modify(ls(i),x,k);
else modify(rs(i),x,k);
}
int q_pre(int i,int ql,int qr,int k){
int l=l(i),r=r(i);
if(ql<=l&&r<=qr){
return pre(rt(i),k);
}
int mid=(l+r)>>1,res=-inf;
if(ql<=mid) res=max(res,q_pre(ls(i),ql,qr,k));
if(mid>1,res=inf;
if(ql<=mid) res=min(res,q_nxt(ls(i),ql,qr,k));
if(mid
\(T_G\)
JSOI2008������prefix
ƽ����ά�����У�
\(\tt{FHQ}\)
��������С���ѣ�ά��
\(hash\)
ֵ�����ڵ��������
\(hash\)
ֵ����������
\(LCP\)
��ע������ַ���Ҫ
++n
��
����
\(\tt{FHQ}\)
�ô�
\(\tt{Splay}\)
�Ժ���˵��
FHQ_Treap
#include
using namespace std;
#define ull unsigned long long
#define read read()
#define pt puts("")
#define gc getchar
inline int read{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return f*x;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
#define N 100010
const ull base = 233;
int n,m;
char s[N];
ull pb[N];
void init(){pb[0]=1ull;for(int i=1;ird(y)) merge(rs(x),rs(x),y),i=x;
else merge(ls(y),x,ls(y)),i=y;
up(i);
}
void insert(int x,int k){
int rt1,rt2;
split(rt,x,rt1,rt2);
merge(rt,rt1,New(k));
merge(rt,rt,rt2);
}
void replace(int x,int k){
int rt1,rt2,rt3;
split(rt,x,rt1,rt2);
split(rt1,x-1,rt1,rt3);
merge(rt1,rt1,New(k));
merge(rt,rt1,rt2);
}
ull q_hash(int l,int r){
int rt1,rt2,rt3;
split(rt,r,rt2,rt3);
split(rt2,l-1,rt1,rt2);
ull res=hash(rt2);
merge(rt2,rt1,rt2);
merge(rt,rt2,rt3);
return res;
}
} using namespace FHQ_Treap;
int solve(int l,int r){
int st=0,ed=n-r+1;
int res=0;
while(st<=ed){
int mid=(st+ed)>>1;
if(q_hash(l,l+mid-1)==q_hash(r,r+mid-1)){
st=mid+1;res=mid;
}
else ed=mid-1;
}
return res;
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("lty.in","r",stdin);
freopen("lty.out","w",stdout);
#endif
scanf("%s",s+1);
n=strlen(s+1);m=read;
init();
for(int i=1;i<=n;i++){
insert(i-1,s[i]-'a'+1);
}
char op,x;
int l,r;
while(m-->0){
op=gc();while(op!='Q'&&op!='R'&&op!='I')op=gc();
switch(op){
case 'Q':
l=read,r=read;
write(solve(l,r)),pt;
break;
case 'R':
l=read;x=gc();while(x<'a'||x>'z') x=gc();
replace(l,x-'a'+1);
break;
case 'I':
l=read;x=gc();while(x<'a'||x>'z') x=gc();
insert(l,x-'a'+1);++n;
break;
default:break;
}
}
return 0;
}
\(T_H\)
�����������
����������~~
��������
\(dp_i\)
��ʾ��
\(i\)
λ�ý�β������������г��ȣ���:
���Ƕ��ڴ��⣬���ǰ���
\(1\)
~
\(n\)
��˳����룬Ҳ���ǣ���ǰ���������һ����Ô������������������ô
����ƽ����ά�����У��ڵ���������
\(dp\)
���ֵ��ֱ��ת�Ƽ��ɡ�
-
����
\(\tt{FHQ}\)
�����ѳ�ǰ
\(i\)
����
\(rt1\)
��
\(dp\)
Öµ
\(\tt{+1}\)
������
-
����
\(\tt{Splay}\)
��ת�����ڵ㣬����ӵ�
\(dp\)
Öµ
\(\tt{+1}\)
������
FHQ_Treap
#include
using namespace std;
#define read read()
#define pt puts("")
inline int read{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return f*x;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
const int N = 1e5+10;
int n;
namespace FHQ_Treap{
struct Treap{
int son[2],rd,siz,len,ans;
#define ls(i) t[i].son[0]
#define rs(i) t[i].son[1]
#define rd(i) t[i].rd
#define siz(i) t[i].siz
#define len(i) t[i].len
#define ans(i) t[i].ans
}t[N];
int tot,rt;
void up(int i){
siz(i)=siz(ls(i))+siz(rs(i))+1;
ans(i)=max(ans(ls(i)),ans(rs(i)));
ans(i)=max(ans(i),len(i));
}
void split(int i,int k,int &x,int &y){
if(!i){x=y=0;return;}
if(k<=siz(ls(i))) y=i,split(ls(i),k,x,ls(i));
else x=i,split(rs(i),k-(siz(ls(i))+1),rs(i),y);
up(i);
}
void merge(int &i,int x,int y){
if(!x||!y){i=x|y;return;}
if(rd(x)>rd(y)) merge(rs(x),rs(x),y),i=x;
else merge(ls(y),x,ls(y)),i=y;
up(i);
}
int New(int k){
++tot;
siz(tot)=1;
ans(tot)=len(tot)=k;
rd(tot)=rand();
return tot;
}
void insert(int x){
int rt1,rt2;
split(rt,x,rt1,rt2);
merge(rt,rt1,New(ans(rt1)+1));
merge(rt,rt,rt2);
}
} using namespace FHQ_Treap;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("lty.in","r",stdin);
freopen("lty.out","w",stdout);
#endif
n=read;
for(int x,i=1;i<=n;i++){
x=read;
insert(x);
write(ans(rt));pt;
}
return 0;
}
Splay
#include
using namespace std;
#define read read()
#define pt puts("")
inline int read{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return f*x;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}
const int N = 1e5+10;
int n;
namespace SPLAY{
struct Splay_Tree{
int son[2],fa,ans,siz,val;
#define ls(i) t[i].son[0]
#define rs(i) t[i].son[1]
#define ds(i) t[i].son[d]
#define bs(i) t[i].son[d^1]
#define fa(i) t[i].fa
#define siz(i) t[i].siz
#define ans(i) t[i].ans
#define val(i) t[i].val
}t[N];
int tot,rt;
void up(int i){
siz(i)=siz(ls(i))+siz(rs(i))+1;
ans(i)=max(ans(ls(i)),ans(rs(i)));
ans(i)=max(ans(i),val(i));
}
void rotate(int x){
int y=fa(x),z=fa(y);
int d=(rs(y)==x);
t[z].son[(rs(z)==y)]=x;fa(x)=z;
ds(y)=bs(x);fa(bs(x))=y;
bs(x)=y;fa(y)=x;
up(y),up(x);
}
void splay(int x,int s){
while(fa(x)!=s){
int y=fa(x),z=fa(y);
if(z!=s)
(ls(y)==x)^(ls(z)==y)?rotate(x):rotate(y);
rotate(x);
}
if(!s) rt=x;
}
void find(int x){
if(!rt) return;
int p=rt;
while(siz(ls(p))+1!=x){
if(x<=siz(ls(p))+1){
p=ls(p);
}
else{
x-=(siz(ls(p))+1);
p=rs(p);
}
}
splay(p,0);
}
void insert(int &i,int f,int x,int k){
if(!i){
i=++tot;
fa(i)=f;
siz(i)=1;
ans(i)=val(i)=k;
return;
}
if(x<=siz(ls(i))+1) insert(ls(i),i,x,k);
else insert(rs(i),i,x-siz(ls(i))-1,k);
up(i);
}
} using namespace SPLAY;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("lty.in","r",stdin);
freopen("lty.out","w",stdout);
#endif
n=read;
for(int x,k,i=1;i<=n;i++){
x=read;
if(!x) k=1;
else if(x==i-1) k=ans(rt)+1;
else{
find(x+1);
k=ans(ls(rt))+1;
}
insert(rt,0,x+1,k);
splay(tot,0);
write(ans(rt));pt;
}
return 0;
}
\(T_I\)
��ϵ̽��
�������˸���
\(\tt{ETT/LCT}\)
(
Wang54321
˵��)�����ᡣ
��.�л�
ת�ۼ��ڰ�����Ķ̶�
\(3\)
����ֻʣ����죬���������ܻ����������ж೤ʱ�䡣����
\(3\)
����˵������˵�̲��̣�ѧ���˲��ٶ�������Ȼ�����İ����Ը����Ļ����кܴ����������:
����ѧ�Ķ����������Ⱳ�Ӷ���һ���ܽӴ����ġ�����
��֪����Ô�����п�ǰ����ѧ�೤ʱ��
\(\tt{OI}\)
����С
\(\tt{H}\)
˵��
Ҳ��֪����Ô��֮��Ķ���ʮ�죬�Լ������������λ��������Сʱ�����ָо������е������������������������۵ĸо��ɡ���Ȼ��Ҳϣ�����������Լ������������ָо�������
\(\tt{HANGRY\_ Sol}\)
û�뵽��ģ��û�����̡��������ࡿ���ǾͰ�
\(\tt{Splay}\)
��β�����÷żټӰ��ˣ���ϧ������ÿһ���Ӱ�...