比赛 防止浮躁的小练习V0.1 评测结果 AAAAAAAAAAAAA
题目名称 政党 最终得分 100
用户昵称 Ostmbh 运行时间 1.230 s
代码语言 C++ 内存使用 12.14 MiB
提交时间 2016-10-07 17:56:23
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
const int MAX=200000+10;
vector<int>C[MAX/2];
vector<int>A[MAX];
struct Edge{
	int t,next;
	Edge(){
		next=0;
	}
}E[MAX*2];
int ans[MAX/2]={0};
int fa[MAX];
int d[MAX];
int vis[MAX]={0};
int head[MAX]={0};
int pol[MAX];
int tot=1;
int pla[MAX/2]={0};
int vis1[MAX]={0};
inline void addedge(int x,int y){
	E[tot].t=y,E[tot].next=head[x],head[x]=tot++;
	E[tot].t=x,E[tot].next=head[y],head[y]=tot++;
}
inline int find(int x){
	if(x==fa[x])
		return x;
	return fa[x]=find(fa[x]);
}
inline void tarjan_LCA(int x){
	vis[x]=1;
	for(int i=0;i<A[x].size();i++){
		int u=A[x][i];
		if(!vis[u]){
			tarjan_LCA(u);
			fa[u]=x;
		}
	}
	for(int i=head[x];i;i=E[i].next){
		int u=E[i].t;
		if(vis[u]){
			int lca=find(u);
			ans[pol[x]]=max(ans[pol[x]],d[u]+d[x]-2*d[lca]);
		}
	}
}
inline void read(int& x){
	x=0;
	char c=getchar();
	while(c<'0'||c>'9')
		c=getchar();
	while(c>='0'&&c<='9'){
		x=(x<<3)+(x<<1)+c-'0';
		c=getchar();
	}
}
int main(){
	freopen("cowpol.in","r",stdin);
	freopen("cowpol.out","w",stdout);
	int n,k;
	read(n);
	read(k);
	int y;
	int kc;
	for(int i=1;i<=n;i++){
		read(pol[i]);
		read(y);
		if(y!=0){
			A[i].push_back(y);
			A[y].push_back(i);
		}
		if(y==0)
			kc=i;
		C[pol[i]].push_back(i);
	}
	queue<int>q;
	q.push(kc);
	d[kc]=1;
	vis1[kc]=1;
	while(!q.empty()){
		int cd=q.front();
		q.pop();
		for(int i=0;i<A[cd].size();i++){
			int u=A[cd][i];
			if(!vis1[u]){
				d[u]=d[cd]+1;
				vis1[u]=1;
				q.push(u);
			}
		}
	}
	d[0]=0;
	for(int i=1;i<=n;i++)
		if(d[i]>d[pla[pol[i]]])
			pla[pol[i]]=i;
	for(int i=1;i<=n;i++)
		if(i!=pla[pol[i]]){
			addedge(i,pla[pol[i]]);
		}
	for(int i=1;i<=n;i++)
		fa[i]=i;
	tarjan_LCA(kc);
	for(int i=1;i<=k;i++)
		printf("%d\n",ans[i]);
	/*for(int i=1;i<=n;i++){
		for(int j=head[i];j;j=E[j].next)
			printf("%d ",E[j].t);
		printf("\n");
	}*/
return 0;
}