求调splay,马蜂阳间,悬关
查看原帖
求调splay,马蜂阳间,悬关
469470
EurekaStriker楼主2023/11/10 17:30
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN=1000010,p=1000000;
int n,son[MAXN][2],fa[MAXN],cnt,num,k,x;
int tot[MAXN],sze[MAXN],root,val[MAXN],ans;
inline void clear(int x){
    sze[x]=fa[x]=son[x][0]=son[x][1]=tot[x]=val[x]=0;
}
bool get(int x){
    return x==son[fa[x]][1];
}
inline void maintain(int x){
    sze[x]=sze[son[x][0]]+sze[son[x][1]]+tot[x];
}
inline void rotate(int x){
    int y=fa[x],z=fa[y],k=get(x);
    son[y][k]=son[x][k^1];
    fa[son[x][k^1]]=y;
    son[x][k^1]=y;
    fa[y]=x;
    fa[x]=z;
    if(z)
    	son[z][son[z][1]==y]=x;
    maintain(y);
    maintain(x);
}
inline void splay(int x,int k){
    for(int y=fa[x];y!=k;rotate(x),y=fa[x])
        if(fa[y]!=k)
            rotate((get(x)==get(y))?y:x);
    if(!k)
    	root=x;
}
inline void insert(int k){
    if(!root){
        val[++cnt]=k;
        ++tot[cnt];
        root=cnt;
        maintain(root);
        return;
    }
    int x=root,y=0;
    while(1){
        if(val[x]==k){
            ++tot[x];
            maintain(x);
            maintain(y);
            splay(x,0);
            break;
        }
        y=x;
        x=son[x][(val[x]<k)];
        if(!x){
            val[++cnt]=k;
            ++tot[cnt];
            fa[cnt]=y;
            son[y][(val[y]<k)]=cnt;
            maintain(cnt);
            maintain(y);
            splay(cnt,0);
            break;
        }
    }
}
inline int find_num(int k){
    int x=root;
    if(sze[x]<k)
     	return -1;
    while(1){
        if(son[x][0]&&k<=sze[son[x][0]])
            x=son[x][0];
        else{
            int temp=sze[son[x][0]]+tot[x];
            if(k<=temp)
            	return val[x];
            k-=temp;
            x=son[x][1];
        }
    }
}
inline int find_rank(int k)
{
	int ans=0,x=root;
	if(!x)
		return -1;
	while(1){
		if(k<val[x])
			x=son[x][0];
		else{
			ans+=sze[son[x][0]];
			if(k==val[x]){
				splay(x,0);
				return ans+1;
			}
			ans+=tot[x];
			x=son[x][1];
		}
	}
}
inline int pre()
{
    int x=son[root][0];
    while(son[x][1])
        x=son[x][1];
    splay(x,0);
    return x;
}
inline int nxt()
{
	int x=son[root][1];
	while(son[x][0])
		x=son[x][0];
	splay(x,0);
	return x;
}
inline void del(int k)
{
    int temp=find_rank(k);
    if(temp==-1)
    	return;
    if(tot[root]>1){
        --tot[root];
        maintain(root);
        return;
    }
    else if(!son[root][0]&&!son[root][1]){
        clear(root);
        root=0;
        return;
    }
    else if(!son[root][0]){
        int x=root;
        root=son[x][1];
        fa[root]=0;
        clear(x);
        return;
    }
    else if(!son[root][1]){
        int x=root;
        root=son[x][0];
        fa[root]=0;
        clear(x);
        return;
    }
    int x=root,pre1=pre();
    fa[son[x][1]]=pre1;
    son[pre1][1]=son[x][1];
    clear(x);
    maintain(root);
    return;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%lld%lld",&k,&x);
		if(num==0)
			insert(x);
		else if(num>0){
			if(k==0)
				insert(x);
			else{
				int temp1=val[pre()],temp2=val[nxt()];
				if(abs(temp1-x)<=abs(temp2-x))
					ans+=abs(temp1-x),del(temp1),cout<<abs(temp1-x)<<"  1"<<endl;
				else	
					ans+=abs(temp2-x),del(temp2),cout<<abs(temp2-x)<<"  2"<<endl;
			}
		}
		else{
			if(k==1)
				insert(x);
			else{
				int temp1=val[pre()],temp2=val[nxt()];
				if(abs(temp1-x)<=abs(temp2-x))
					ans+=abs(temp1-x),del(temp1),cout<<abs(temp1-x)<<"  3"<<endl;
				else
					ans+=abs(temp2-x),del(temp2),cout<<abs(temp2-x)<<"  4"<<endl;
			}	
		}
		if(k==0)
			num++;
		else
			num--;
	}
	cout<<ans%p;
    return 0;
}

我那还压着一篇求助帖呢5555555o(╥﹏╥)o

2023/11/10 17:30
加载中...