萌新求助 Splay
查看原帖
萌新求助 Splay
178556
Skyjoy楼主2020/9/3 19:15

#9 死循环过不起啊!

代码都是照着模板打的啊

代码:

#include<bits/stdc++.h>
#define N 80010
#define mod 1000000
#define inf 2147483647
#define ls s[0]
#define rs s[1] 
using namespace std;
int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			f=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<3)+(x<<1)+ch-'0';
		ch=getchar();
	}
	return x*f;
}
int n,check,ans,a,b,root,pre1,pre2,cnt,cur;
struct node{
	int s[2],val,f;
}p[N];
void rotate(int x){
	int y=p[x].f,z=p[y].f,k=p[y].rs==x;
	p[z].s[p[z].rs==y]=x,p[x].f=z;
	p[y].s[k]=p[x].s[k^1],p[p[x].s[k^1]].f=y;
	p[x].s[k^1]=y,p[y].f=x;
}
void Splay(int x,int goal){
	int y,z;
	while(p[x].f!=goal){
		y=p[x].f,z=p[y].f;
		if(z!=goal){
			if((p[y].ls==x)^(p[z].ls==y)){
				rotate(x);
			}
			else{
				rotate(y);
			}
		}
		rotate(x);
	}
	if(!goal){
		root=x;
	}
}
void insert(int x){
	int u=root,f=0;
	while(u&&p[u].val!=x){
		f=u,u=p[u].s[x>p[u].val];
	}
	if(!u){
		u=++cnt;
		if(f){
			p[f].s[x>p[f].val]=u;
		}
		p[cnt].ls=p[cnt].rs=0,p[cnt].f=f,p[cnt].val=x;
	}
	Splay(u,0);
}
void find(int x){
	int u=root;
	if(!u){
		return;
	}
	while(p[u].s[x>p[u].val]&&x!=p[u].val){
		u=p[u].s[x>p[u].val];
	}
	Splay(u,0);
}
int Next(int x,int f){
	find(x);
	int u=root;
	if((x>p[u].val&&!f)||(x<p[u].val&&f)){
		return u;
	}
	u=p[u].s[f];
	while(p[u].s[f^1]){
		u=p[u].s[f^1];
	}
	return u;
}
void Delete(int x){
	int a=Next(x,0),b=Next(x,1);
	Splay(a,0),Splay(b,a);
	p[b].ls=0;
}
int main(){
	n=read();
	insert(-inf),insert(inf);
	while(n--){
		a=read(),b=read();
		if(!check){
			cur=a,check++;
			insert(b);
		}
		else if(!(a^cur)){
			check++;
			insert(b);
		}
		else{
			pre1=p[Next(b,0)].val,pre2=p[Next(b,1)].val;
			if(abs(pre1-b)<=abs(pre2-b)){
				ans+=abs(pre1-b);
				Delete(pre1);
			}
			else{
				ans+=abs(pre2-b);
				Delete(pre2);
			}
			ans%=mod,check--;
		}
	}
	printf("%d",ans);
	return 0;
}

qwq

2020/9/3 19:15
加载中...