吸氧用时1.43s,TLE on #14.
替罪羊树code:
#include<bits/stdc++.h>
//#pragma GCC optimize("1")
//#pragma GCC optimize("3")
#define ll long long
using namespace std;
ll n,opt,x,z,order[100005],tree_stack[100005];
ll cnt,ttop,root,ret,deep,td;
const double alpha=0.75;
struct node
{
ll ls,rs,val,tot,sz,del;
}e[100005];
inline bool is_balanced(ll u)
{
if(max(e[e[u].ls].sz,e[e[u].rs].sz)>=(double)e[u].sz*alpha) return false;
else return true;
}
inline void push_up(ll u)
{
e[u].sz=e[e[u].ls].sz+e[e[u].rs].sz+1;
e[u].tot=e[e[u].ls].tot+e[e[u].rs].tot+1;
}
inline void initnode(ll &u)
{
e[u].ls=e[u].rs=0;
e[u].sz=e[u].tot=e[u].del=1;
}
inline void build(ll l,ll r,ll &u)
{
ll mid=(l+r)>>1;
u=order[mid];
if(l==r) //叶子节点
{
initnode(u);
return ;
}
if(l<mid) build(l,mid-1,e[u].ls); //左树
if(l==mid) e[u].ls=0; //没有左树
build(mid+1,r,e[u].rs); //有左就有右
push_up(u);
}
inline void inorder(ll u)//中序遍历
{
if(!u) return ;
inorder(e[u].ls);
if(e[u].del) order[++cnt]=u;
else tree_stack[++ttop]=u;
inorder(e[u].rs);
}
inline void rebuild(ll &u)
{
cnt=0;
inorder(u); //拍平
if(!cnt) u=0;
else build(1,cnt,u);
}
inline void insert(ll now,ll &u,ll x,ll &y,ll y_fa)
{
if(!u)
{
u=tree_stack[ttop--];
e[u].val=x;
initnode(u);
return ;
}
e[u].sz++;
e[u].tot++;
if(e[u].val>=x) insert(e[u].ls,e[u].ls,x,y,y_fa);
else insert(e[u].rs,e[u].rs,x,y,y_fa);
if(!is_balanced(now)) y=now,td=0;
if(e[now].ls==y||e[now].rs==y) y_fa=now;
td++;
if((now==root&&y!=-1&&deep+1<td)||(e[u].tot*alpha>=e[u].sz))
{
if(y==root)
{
rebuild(y);
root=y;
}
else
{
if(e[y_fa].ls==y)
{
rebuild(y);
e[y_fa].ls=y;
}
if(e[y_fa].rs==y)
{
rebuild(y);
e[y_fa].rs=y;
}
}
}
}
inline ll ranks(ll u,ll x)
{
if(!u) return 0;
if(e[u].val<x) return e[e[u].ls].sz+e[u].del+ranks(e[u].rs,x);
else return ranks(e[u].ls,x);
}
inline ll kth(ll u,ll k)
{
ret=0;
while(u)
{
if(e[u].del&&e[e[u].ls].sz+1==k) return e[u].val;
else if(e[e[u].ls].sz+e[u].del<k)
{
k=k-e[e[u].ls].sz-e[u].del;
u=e[u].rs;
}
else u=e[u].ls;
}
}
inline void del_kth(ll &u,ll k)
{
e[u].sz--;
if(e[u].del&&e[e[u].ls].sz+1==k)
{
e[u].del=0;
return ;
}
else if(e[e[u].ls].sz+e[u].del<k) del_kth(e[u].rs,k-e[e[u].ls].sz-e[u].del);
else return del_kth(e[u].ls,k);
}
inline void del(ll x)
{
del_kth(root,ranks(root,x)+1);
if(e[root].tot*alpha>=e[root].sz) rebuild(root);
}
signed main(){
for(ll i=100000;i>=1;i--)
tree_stack[++ttop]=i;
scanf("%lld",&n);
while(n--)
{
scanf("%lld %lld",&opt,&x);
ll rebuild_root=-1;
if(opt==1)
{
td=0;
deep=log2(e[root].sz+1);
insert(root,root,x,rebuild_root,-1);
}
if(opt==2) del(x);
if(opt==3) printf("%lld\n",ranks(root,x)+1);
if(opt==4) printf("%lld\n",kth(root,x));
if(opt==5) printf("%lld\n",kth(root,ranks(root,x)));
if(opt==6) printf("%lld\n",kth(root,ranks(root,x+1)+1));
}
return 0;
}
help,求求(尽力了)