FHQ-treap WA0pts 求调(已过样例
查看原帖
FHQ-treap WA0pts 求调(已过样例
1046448
Polaris_flame楼主2023/10/20 11:48
#include<bits/stdc++.h>
#define FL(i,a,b) for(int i=(a);i<=(b);i++)
#define FR(i,a,b) for(int i=(a);i>=(b);i--)
#define ll long long
using namespace std;
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
const int MAXN = 8e4 + 10;
const int mod = 1e6;
struct node{
	int l,r,key,val,siz;
}a[MAXN],b[MAXN];//a宠物,b人 
int roota,rootb,cnta=0,cntb=0,x,y,z;
void updatea(int p){
	a[p].siz=a[a[p].l].siz+a[a[p].r].siz+1;
}
void splita(int p,int key,int &x,int &y){
	if(!p) x=y=0;
	else{
		if(a[p].key<=key){
			x=p;
			splita(a[p].r,key,a[p].r,y);
		}
		else{
			y=p;
			splita(a[p].l,key,x,a[p].l);
		}
	}
	return ;
}
int mergea(int x,int y){
	if(!x||!y) return x+y;
	if(a[x].val>a[y].val){
		a[x].r=mergea(a[x].r,y);
		updatea(x);
		return x;
	}
	else{
		a[y].l=mergea(x,a[y].l);
		updatea(y);
		return y;
	}
}
int getnodea(int key){
	a[++cnta].key=key;
	a[cnta].val=rnd();
	a[cnta].siz=1;
	return cnta;
}
int get_preva(int key){
	splita(roota,key-1,x,y);
	int p=x;
	while(a[p].r) p=a[p].r;
	return a[p].key;
}
int get_nexta(int key){
	splita(roota,key,x,y);
	int p=y;
	while(a[p].l) p=a[p].l;
	roota=mergea(x,y);
	return a[p].key;
}
void inserta(int key){
	splita(roota,key-1,x,y);
	roota=mergea(mergea(x,getnodea(key)),y);
}
void dela(int key){
	splita(roota,key,x,z);
	splita(x,key-1,x,y);
	y=mergea(a[y].l,a[y].r);
	roota=mergea(mergea(x,y),z);
}

void updateb(int p){
	b[p].siz=b[b[p].l].siz+b[b[p].r].siz+1;
}
void splitb(int p,int key,int &x,int &y){
	if(!p) x=y=0;
	else{
		if(b[p].key<=key){
			x=p;
			splitb(b[p].r,key,b[p].r,y);
		}
		else{
			y=p;
			splitb(b[p].l,key,x,b[p].l);
		}
	}
	return ;
}
int mergeb(int x,int y){
	if(!x||!y) return x+y;
	if(b[x].val>b[y].val){
		b[x].r=mergeb(b[x].r,y);
		updateb(x);
		return x;
	}
	else{
		b[y].l=mergeb(x,b[y].l);
		updateb(y);
		return y;
	}
}
int getnodeb(int key){
	b[++cntb].key=key;
	b[cntb].val=rnd();
	b[cntb].siz=1;
	return cntb;
}
int get_prevb(int key){
	splitb(rootb,key-1,x,y);
	int p=x;
	while(b[p].r) p=b[p].r;
	return b[p].key;
}
int get_nextb(int key){
	splitb(rootb,key,x,y);
	int p=y;
	while(b[p].l) p=b[p].l;
	rootb=mergeb(x,y);
	return b[p].key;
}
void insertb(int key){
	splitb(rootb,key-1,x,y);
	rootb=mergeb(mergeb(x,getnodeb(key)),y);
}
void delb(int key){
	splitb(rootb,key,x,z);
	splitb(x,key-1,x,y);
	y=mergeb(b[y].l,b[y].r);
	rootb=mergeb(mergeb(x,y),z);
}
int main(){
	int n,sum1=0,sum2=0,ans=0;
	scanf("%d",&n);
	inserta(-1e9);
	inserta(1e9);
	insertb(-1e9);
	insertb(1e9);
	FL(i,1,n){
		int a,b;
		scanf("%d%d",&a,&b);
		if(a==0){
			if(sum2){
				int l=get_prevb(b);
				int r=get_nextb(b);
				//printf("human l=%d,r=%d\n",l,r);
				if((b-l)<=(r-b)){
					ans+=(b-l);
					delb(l);
				}
				else{
					ans+=(r-b);
					delb(r);
				}
				sum2--;
			}
			else{
				sum1++;
				inserta(b);
			}
			ans%=mod;
		}
		else{
			if(sum1){
				int l=get_preva(b);
				int r=get_nexta(b);
				//printf("pet l=%d,r=%d\n",l,r);
				if((b-l)<=(r-b)){
					//printf("ch %d\n",l);
					ans+=(b-l);
					dela(l);
				}
				else{
					//printf("ch %d\n",r);
					ans+=(r-b);
					dela(r);
				}
				sum1--;
			}
			else{
				sum2++;
				insertb(b);
			}
			ans%=mod;
		}
	}
	printf("%d\n",ans);
}
2023/10/20 11:48
加载中...