#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<deque>
#include<map>
#include<bitset>
#include<set>
#include<cstdio>
#include<vector>
#define ll long long
#define PI 3.1415926
#define mem(a,b) memset(a,b,sizeof(a))
#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )
#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )
#define lowbit(a) ((a)&-(a))
const ll INF=0x3f3f3f3f;
const ll Max=100005;
using namespace std;
int t,n,m,p;
int Size,cnt[Max],key[Max],rd[Max],siz[Max];
int son[Max][2];//son[Max][0]表示左儿子,son[Max][1],表示右儿子
/*queue<ll> q;
stack<ll> s;
//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q;*/
void push_up(int x)
{
siz[x]=siz[son[x][0]]+siz[son[x][1]]+cnt[x];
}
void rotate(int &x,int d)//0左旋,1右旋
{
int p=son[x][!d];
son[x][!d]=son[p][d];
son[p][d]=x;
push_up(x);
push_up(p);
x=p;
}
void insert(int &rt,int x)//插入
{
if(!rt)
{
rt=++Size;
siz[rt]=cnt[rt]=1;
key[rt]=x;
rd[rt]=rand();
return ;
}
if(key[rt]==x)
{
cnt[rt]++;
siz[rt]++;
return ;
}
int d=x>key[rt];
insert(son[rt][d],x);
if(rd[rt]<rd[son[rt][d]])
rotate(rt,!d);
push_up(rt);
}
void delet(int &rt,int x)//删除
{
if(!rt)
return ;
if(x!=key[rt])
delet(son[rt][x>key[rt]],x);
else
{
if(!son[rt][0]&&!son[rt][1])
{
cnt[rt]--;
siz[rt]--;
if(!cnt[rt])
rt=0;
}
else if(son[rt][0]&&!son[rt][1])
{
rotate(rt,1);
delet(son[rt][1],x);
}
else if(!son[rt][0]&&son[rt][1])
{
rotate(rt,0);
delet(son[rt][0],x);
}
else
{
int d=rd[son[rt][0]]>rd[son[rt][1]];
rotate(rt,d);
delet(son[rt][d],x);
}
}push_up(rt);
}
int pre(int rt,int x)//找前驱
{
if(!rt)
return -INF;
if(key[rt]>=x)
return pre(son[rt][0],x);
else return max(key[rt],pre(son[rt][1],x));
}
int suf ( int rt, int x ) {//找后驱
if ( ! rt )
return INF;
if ( key[rt] <= x )
return suf ( son[rt][1], x );
else
return min ( key[rt], suf ( son[rt][0], x ) );
}
int find ( int rt, int x ) {//找排名为x的数
if ( ! rt )
return 0;
if ( siz[son[rt][0]] >= x )
return find ( son[rt][0], x );
else if ( siz[son[rt][0]] + cnt[rt] < x )
return find ( son[rt][1], x - cnt[rt] - siz[son[rt][0]] );
else
return key[rt];
}
int search_rank ( int rt, int x ) {//找x的排名
if ( ! rt )
return 0;
if ( key[rt] == x )
return siz[son[rt][0]] + 1;
if ( key[rt] < x )
return siz[son[rt][0]] + cnt[rt] + search_rank ( son[rt][1], x );
return search_rank ( son[rt][0], x );
}
int main()
{
return 0;
}
07-19
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交