记录编号 489434 评测结果 AAAAAAAAAA
题目名称 [HNOI 2004] 宠物收养所 最终得分 100
用户昵称 GravatarCSU_Turkey 是否通过 通过
代码语言 C++ 运行时间 0.386 s
提交时间 2018-03-02 15:02:07 内存使用 1.29 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int inf=8e4+10;
const int mod=1e6;
const double alpha=0.75;
LL ans;
int ls[inf],rs[inf],siz[inf],val[inf];
int n,sz,rt;
int p[inf],cnt;
int flag=-1;
int id,f;
void update(int x){
	siz[x]=siz[ls[x]]+siz[rs[x]]+1;
}
int rebuild(int l,int r){
	if(l>r)return 0;
	int mid=(l+r)>>1;
	int x=p[mid];
	siz[x]=1;
	ls[x]=rebuild(l,mid-1);
	rs[x]=rebuild(mid+1,r);
	update(x);
	return x;
}
void insert(int &x,int y){
	if(!x){
		x=++sz;
		siz[x]=1;
		val[x]=y;
		return ;
	}
	if(y<val[x])insert(ls[x],y);
	else insert(rs[x],y);
	update(x);
	if(max(siz[ls[x]],siz[rs[x]])>alpha*siz[x])id=x;
	if(ls[x]==id || rs[x]==id)f=x;
}
void dfs(int x){
	if(ls[x])dfs(ls[x]);
	p[++cnt]=x;
	if(rs[x])dfs(rs[x]);
}
void work(int x){
	id=-1;
	insert(rt,x);
	if(id!=-1){
		if(id==rt)f=0;
		cnt=0;
		dfs(id);
		int u=rebuild(1,cnt);
		if(ls[f]==id)ls[f]=u;
		else if(rs[f]==id)rs[f]=u;
		else rt=u;
	}
}
void del(int &x,int y){
	if(val[x]==y){
		if((!ls[x]) && (!rs[x]))x=0;
		else if(!ls[x])x=rs[x];
		else if(!rs[x])x=ls[x];
		else {
			int tmp=ls[x];
			while(rs[tmp])tmp=rs[tmp];
			val[x]=val[tmp];
			del(ls[x],val[x]);
			update(x);
		}
		return ;
	}
	if(y<val[x])del(ls[x],y);
	else del(rs[x],y);
	update(x);
}
int pre(int x,int y,int Max){
	if(!x)return Max;
	if(val[x]<=y){
		Max=max(Max,val[x]);
		return pre(rs[x],y,Max);
	}
	else return pre(ls[x],y,Max);
}
int succ(int x,int y,int Min){
	if(!x)return Min;
	if(val[x]>=y){
		Min=min(Min,val[x]);
		return succ(ls[x],y,Min);
	}
	else return succ(rs[x],y,Min);
}
int main()
{
	freopen("pet.in","r",stdin);
	freopen("pet.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		if(flag==-1){
			work(y);
			flag=x;
		}
		else if(flag==x){
			work(y);
		}
		else {
			int tmp1=pre(rt,y,-0x3fffffff),tmp2=succ(rt,y,0x3fffffff);
			if(tmp2-y<y-tmp1){
				del(rt,tmp2);
				ans+=tmp2-y;
				ans%=mod;
			}
			else {
				del(rt,tmp1);
				ans+=y-tmp1;
				ans%=mod;
			}
			if(!siz[rt])flag=-1;
		}
	}
	printf("%lld\n",ans);
	return 0;
}