splay树 1285 宠物收养所

#include<cstdio>
#include<iostream>
using namespace std;
int shu[80004][2],n,size,root,kind,zhi[80004],fa[80004],sum=0;
int b1,b2;
void xuan(int a1)
{
	int a2,a3,l,r;
	a2=fa[a1];
	a3=fa[a2];
	if(shu[a2][0]==a1)
	  l=0;
	else
      l=1;
	r=l^1;
	if(a2==root)
	  root=a1;
	else
	  if(shu[a3][0]==a2)
	    shu[a3][0]=a1;
	  else
	    shu[a3][1]=a1;
	fa[a1]=a3;
	fa[a2]=a1;
	shu[a2][l]=shu[a1][r];
	fa[shu[a1][r]]=a2;
	shu[a1][r]=a2;
	return;
}
void zhuan(int a1)
{
	int y,z;
	for(;a1!=root;)
     {
      y=fa[a1];
	  z=fa[y];
	  if(y!=root)
	    if((shu[y][0]==a1)^(shu[z][0]==y))
	  	  xuan(a1);
	    else
	      xuan(y);
	  xuan(a1);
	}
}
void cha(int &a1,int a2,int a3)
{
	if(a1==0)
	  {
	  	size++;
	  	a1=size;
	  	zhi[a1]=a2;
	  	fa[a1]=a3;
	  	zhuan(a1);
	    return;
	  }
	if(a2<zhi[a1])
	  cha(shu[a1][0],a2,a1);
	else
	  cha(shu[a1][1],a2,a1);
	return;
}
void qian(int a1,int a2)
{
	if(a1==0)
	  return;
	if(zhi[a1]<=a2)
	  {
	  	b1=a1;
	  	qian(shu[a1][1],a2);
	  }
	else
	  qian(shu[a1][0],a2);
	return;
}
void hou(int a1,int a2)
{
	if(a1==0)
	  return;
	if(zhi[a1]>=a2)
	  {
	  	b2=a1;
	  	hou(shu[a1][0],a2);
	  }
	else
	  hou(shu[a1][1],a2);
}
void del(int a1)
{
	zhuan(a1);
	if(shu[a1][0]*shu[a1][1]==0)
    	root=shu[a1][0]+shu[a1][1];
	else
	  {
	  	int k=shu[a1][1];
	  	while(shu[k][0])
		  k=shu[k][0];
	  	  shu[k][0]=shu[a1][0];
	  	  fa[shu[a1][0]]=k;
	  	  root=shu[a1][1];
		}
	fa[root]=0;
	return;
}
int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	  {
	  	int a1,a2;
	  	scanf("%d%d",&a1,&a2);
	  	if(!root)
	  	  kind=a1;
	  	if(kind==a1)
	  	  cha(root,a2,0);
	  	else
	  	  {
	  	  	b1=-1;
			b2=-1;
	  	  	qian(root,a2);
	  	  	hou(root,a2);
		if(b1==-1)
		  {
		  	sum+=zhi[b2]-a2;
		  	sum%=1000000;
		  	del(b2);
		  }
		 else if(b2==-1)
		  {
		  	sum+=a2-zhi[b1];
		  	sum%=1000000;
			del(b1);
		  }
		  else if(a2-zhi[b1]<=zhi[b2]-a2)
		  {
		  	sum+=a2-zhi[b1];
		  	sum%=1000000;
		  	del(b1);
		  }
		else
		  {
		  	sum+=zhi[b2]-a2;
		  	sum%=1000000;
		  	del(b2);
	      }
		  }
	  }
	printf("%d",sum);
	return 0;
}
时间: 2024-08-06 01:36:26

splay树 1285 宠物收养所的相关文章

C++之路进阶——splay树(宠物收养所)

1285 宠物收养所 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^31),而他也给每个处在收养所的宠物一个特点值.这样他就能够很方便的处理整个领养宠物的过程了,宠物收养所总

bzoj1208 宠物收养所treap/splay/set

偷懒用set 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<set> 5 #include<algorithm> 6 #define rep(i,l,r) for(int i=l;i<r;i++) 7 #define update(a) (ans+=a)%=1000000 8 typedef long long ll; 9 using names

【BZOJ-1208】宠物收养所 Splay

1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6638  Solved: 2601[Submit][Status][Discuss] Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^

1208. [HNOI2004]宠物收养场【平衡树-splay】

Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^31),而他也给每个处在收养所的宠物一个特点值.这样他就能够很方便的处理整个领养宠物的过程了,宠物收养所总是会有两种情况发生:被遗弃的宠物过多或者是想要收养宠物的人太多,而宠物太少. 1. 被遗弃的宠物过多时,假若到来一个领养者

洛谷P2286宠物收养场

1 #include<cstdio> 2 #define abs(a,b) (a>b?a-b:b-a) 3 #define MOD 1000000 4 #define MXN 450000+5 5 int read(){ 6 int x=0,w=1; 7 char c=getchar(); 8 while(c<'0'||c>'9'){ 9 if(c=='-') w=-1; 10 c=getchar(); 11 } 12 while(c>='0'&&c&l

[bzoj1208][HNOI2004]宠物收养所

题目好长啊直接copy算了 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^31),而他也给每个处在收养所的宠物一个特点值.这样他就能够很方便的处理整个领养宠物的过程了,宠物收养所总是会有两种情况发生:被遗弃的宠物过多或者是想要收养宠物的人太多,而宠物太少. 1. 被遗弃的宠物过多时,假若到来一个领

宠物收养所(bzoj1208)

Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^31),而他也给每个处在收养所的宠物一个特点值.这样他就能够很方便的处理整个领养宠物的过程了,宠物收养所总是会有两种情况发生:被遗弃的宠物过多或者是想要收养宠物的人太多,而宠物太少. 1. 被遗弃的宠物过多时,假若到来一个领养者

【bzoj1208】[HNOI2004]宠物收养所

Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^31),而他也给每个处在收养所的宠物一个特点值.这样他就能够很方便的处理整个领养宠物的过程了,宠物收养所总是会有两种情况发生:被遗弃的宠物过多或者是想要收养宠物的人太多,而宠物太少. 1. 被遗弃的宠物过多时,假若到来一个领养者

AC日记——宠物收养所 bzoj 1208

1208 思路: 一棵splay树: 如果来者是宠物且树空,就将其加入树中: 如果树不空,则查找前驱后继,取最优,然后删点: 对人亦然: 注意边界和取模,最后的ans用long long其余用int即可: 来,上代码: #include <cstdio> #include <iostream> #include <algorithm> using namespace std; #define maxn 80005 #define mod 1000000 #define