记录编号 188338 评测结果 AAAAAAAAAA
题目名称 [POI 2003]可爱的猴子 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 0.558 s
提交时间 2015-09-22 19:30:13 内存使用 9.28 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
using namespace std;
const int SIZEN=200010,SIZEM=400010;
int N,M;
int L[SIZEN][3];
bool ch[SIZEN][3]={0};//标记边在最后是否还存在
int last[SIZEN]={0};
int m[SIZEM],h[SIZEM],f[SIZEN]={0};
class miku
{
public:
	int x,next;
	miku()
	{
		x=-1;next=0;
	}
}P[SIZEN];//链表
void change(int x,int t)
{
	P[x].x=t;
}
int find(int x)
{
	if(x==f[x])
		return x;
	else return f[x]=find(f[x]);
}
void linkP(int x,int y)
{
	int tem=x;
	while(P[tem].next!=0) tem=P[tem].next;
	P[tem].next=y;
}
void link(int x,int y,int t)
{
	int temx=find(x),temy=find(y);
	if(temx==temy) return;
	if(temx==1) {f[temy]=temx;linkP(last[temx],temy);change(temy,t);last[temx]=last[temy];}
	else {f[temx]=temy;linkP(last[temy],temx);if(temy==1)change(temx,t);last[temy]=last[temx];}
}
void read()
{
	scanf("%d%d",&N,&M);
	for(int i=1;i<=N;i++)
		scanf("%d%d",&L[i][1],&L[i][2]);
	for(int i=1;i<=M;i++)
	{
		scanf("%d%d",&m[i-1],&h[i-1]);
		ch[m[i-1]][h[i-1]]=1;
	}
}
void work()
{
	for(int i=1;i<=N;i++) {f[i]=i;last[i]=i;}
	for(int i=1;i<=N;i++)
	{
		for(int j=1;j<=2;j++)
		{
			if(ch[i][j]==0&&L[i][j]!=-1)
				link(i,L[i][j],-1);
		}
	}
	//for(int i=1;i<=N;i++)
	//	cout<<i<<" "<<f[i]<<endl;
	for(int i=M-1;i>=0;i--)
	{
		link(m[i],L[m[i]][h[i]],i);
		//for(int j=1;j<=N;j++)
		//	cout<<j<<" "<<P[j].x<<" "<<P[j].next<<" "<<f[j]<<endl;
	}
	int tem=1,now=-1;
	while(tem!=0)
	{
		if(P[tem].x==-1) P[tem].x=now;
		else now=P[tem].x;
		tem=P[tem].next;
	}
	for(int i=1;i<=N;i++)
		printf("%d\n",P[i].x);
}
int main()
{
	freopen("monkeya.in","r",stdin);
	freopen("monkeya.out","w",stdout);
	read();
	work();
	return 0;
}