Splay求调,样例输出0,悬赏1关注
查看原帖
Splay求调,样例输出0,悬赏1关注
629192
lisida0820楼主2022/6/20 18:49
#include <bits/stdc++.h>
#define LL long long
#define INF 2147483647
namespace IO{
	inline LL read(){
	    LL x=0,f=1;char ch=getchar();
	    for (;!isdigit(ch);ch=getchar())if (ch=='-')f=-1;
	    for (;isdigit(ch);ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
	    return x*f;
	}
	inline void write(LL x,char c='\n'){
	    if (x){
	    	if (x<0)x=-x,putchar('-');
	    	char a[30];short l;
	    	for (l=0;x;x/=10)a[l++]=x%10^48;
	    	for (l--;l>=0;l--)putchar(a[l]);
		}
		else putchar('0');putchar(c);
	}
	inline char getc(){
		char ch=getchar();
		while (isspace(ch))ch=getchar();
		return ch;
	}
}
using namespace IO;
using namespace std;

const int N = 2e5+10;
const int mod = 1e6;
struct Splay{int ch[2],fa,val;}spl[N];
int cnt,root;
bool ident(int x,int f){return spl[f].ch[1]==x;}
void connect(int x,int f,int s){spl[f].ch[s]=x;spl[x].fa=f;}
void rotate(int x){
	int f=spl[x].fa,ff=spl[f].fa,k=ident(x,f);
	connect(spl[x].ch[k^1],f,k);
	connect(x,ff,ident(f,ff));
	connect(f,x,k^1);
}
void splaying(int x,int top){
	if (!top)root=x;
	while (spl[x].fa!=top){
		int f=spl[x].fa,ff=spl[f].fa;
		if (ff!=top)ident(x,f)^ident(f,ff)?rotate(x):rotate(f);
		rotate(x);
	}
}
void ins(int val){
	int now=root,fa=0;
	while (now&&spl[now].val!=val)
		fa=now,now=spl[now].ch[spl[now].val<val];
	if (!now){
		now=++cnt;
		if (fa)spl[fa].ch[spl[fa].val<val]=now;
		spl[now].fa=fa;
		spl[now].ch[0]=spl[now].ch[1]=0;
		spl[now].val=val;
	}
	splaying(now,0);
}
void findx(int val){
	int now=root;if (!now)return;
	while (spl[now].ch[val>spl[now].val]&&val!=spl[now].val)
		now=spl[now].ch[val>spl[now].val];
	splaying(now,0);
}
int getnxt1(int x,int k){
	findx(x);int now=root;
	if (!k&&spl[now].val<=x)return now;
	if (k&&spl[now].val>=x) return now;
	now=spl[now].ch[k];
	while (spl[now].ch[k^1])now=spl[now].ch[k^1];
	return now;
}
int getnxt2(int x,int k){
	findx(x);int now=root;
	if (!k&&spl[now].val<x)return now;
	if (k&&spl[now].val>x) return now;
	now=spl[now].ch[k];
	while (spl[now].ch[k^1])now=spl[now].ch[k^1];
	return now;
}
void del(int val){
	int pre=getnxt2(val,0),nxt=getnxt2(val,1);
	splaying(pre,0);splaying(nxt,pre);
	spl[nxt].ch[0]=0;
}
int main(){
	int n=read(),tot=0,ans=0;
	ins(INF);ins(-INF);
	for (int i=1;i<=n;i++){
		int a=read(),b=read();
		if (!tot)ins(b);
		if (tot>1)
			if (!a)ins(b);
			else{
				int pre=spl[getnxt1(b,0)].val;
				int nxt=spl[getnxt1(b,1)].val;
				if (abs(pre-b)<=abs(nxt-b))ans+=abs(pre-b),del(pre);
				else ans=(ans+(abs(nxt-b)))%mod,del(nxt);
			}
		if (tot<0)
			if (a==1)ins(b);
			else{
				int pre=spl[getnxt1(b,0)].val;
				int nxt=spl[getnxt1(b,1)].val;
				if (abs(pre-b)<=abs(nxt-b))ans=(ans+abs(pre-b))%mod,del(pre);
				else ans=(ans+abs(nxt-b))%mod,del(nxt);
			}
		if (!a)cnt++;
		else cnt--;
	}
	write(ans);
    return 0;
}
2022/6/20 18:49
加载中...