FHQ-Treap 50pts TLE求助,玄关
查看原帖
FHQ-Treap 50pts TLE求助,玄关
775469
danzhu2022楼主2024/7/4 10:28
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int Nm=1e5+10;
int tot=0,root=0,root1=0;;
int size[Nm],dat[Nm],ch[Nm][3];
ll val[Nm];
inline void build(int x){
	tot++;
	size[tot]=1;
	val[tot]=x;
	dat[tot]=rand();
	ch[tot][0]=ch[tot][1]=0;
}
inline void pushup(int id){
	size[id]=size[ch[id][0]]+size[ch[id][1]]+1;
}
inline void split(int u,int x,int &L,int &R){
	if(u==0){
		L=R=0;
		return;
	}
	if(val[u]<=x){
		L=u;
		split(ch[u][1],x,ch[u][1],R);
	}
	else{
		R=u;
		split(ch[u][0],x,L,ch[u][0]);
	}
	pushup(u);
}
inline int merge(int L,int R){
	if(L==0||R==0)return L+R;
	if(dat[L]>dat[R]){
		ch[L][1]=merge(ch[L][1],R);
		pushup(L);
		return L;
	}
	else{
		ch[R][0]=merge(L,ch[R][0]);
		pushup(R);
		return R;
	}
}
inline void insert(int x){
	build(x);
	int L,R;
	split(root,x,L,R);
	root=merge(merge(L,tot),R);
}
inline void insert1(int x){
	build(x);
	int L,R;
	split(root1,x,L,R);
	root1=merge(merge(L,tot),R);
}
inline void del(int x){
	int L,R,p;
	split(root,x,L,R);
	split(L,x-1,L,p);
	p=merge(ch[p][0],ch[p][1]);
	root=merge(merge(L,p),R);
}
inline void del1(int x){
	int L,R,p;
	split(root1,x,L,R);
	split(L,x-1,L,p);
	p=merge(ch[p][0],ch[p][1]);
	root1=merge(merge(L,p),R);
}
inline int fin(int u,int x){
	if(size[ch[u][0]]+1==x)return u;
	if(x<=size[ch[u][0]])return fin(ch[u][0],x);
	else return fin(ch[u][1],x-ch[u][0]-1);
}
inline int before(int x){
	int L,R;
	split(root,x,L,R);
	if(!L)return -1e9;
	int aa=fin(L,size[L]);
	root=merge(L,R);
	return val[aa];
}
inline int before1(int x){
	int L,R;
	split(root1,x,L,R);
	if(!L)return -1e9;
	int aa=fin(L,size[L]);
	root1=merge(L,R);
	return val[aa];
}
inline int after(int x){
	int L,R;
	split(root,x-1,L,R);
	if(!R)return 1e9;
	int aa=fin(R,1);
	root=merge(L,R);
	return val[aa];
}
inline int after1(int x){
	int L,R;
	split(root1,x-1,L,R);
	if(!R)return 1e9;
	int aa=fin(R,1);
	root1=merge(L,R);
	return val[aa];
}
int main(){
	int n;
	cin>>n;
	int op,x;
	ll ans=0,bas=1e6;
	ll i1,i2;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&op,&x);
		if(op==0){
			if(size[root1]==0) insert(x);
			else{
				i1=before1(x);
				i2=after1(x);
				if(x-i1<i2-x) {del1(i1);ans=(ans+x-i1)%bas;}
				else if(x-i1>i2-x) {del1(i2);ans=(ans+i2-x)%bas;}
				else {del1(i1);ans=(ans+x-i1)%bas;}
			}
		}
		if(op==1){
			if(size[root]==0) insert1(x);
			else{
				i1=before(x);
				i2=after(x);
				if(x-i1<i2-x) {del(i1);ans=(ans+x-i1)%bas;}
				else if(x-i1>i2-x) {del(i2);ans=(ans+i2-x)%bas;}
				else {del(i1);ans=(ans+x-i1)%bas;}
			}
		}
	}
	printf("%d",ans);
	return 0;
}

如题

2024/7/4 10:28
加载中...