比赛 20120419s 评测结果 AAAWAWWAWA
题目名称 国王的遗产 最终得分 60
用户昵称 QhelDIV 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-04-19 10:23:17
显示代码纯文本
#include <fstream>
#include <memory.h>
using namespace std;
ifstream fin("legacy.in");
ofstream fout("legacy.out");
int n,tn,K,flag[50000],statue[50000],Index,Max,Re;
class Node
{
public:
	int Name;
	Node *Xt,*Pr;
}Map[50000],*last[50000],*Tar;
void Add(int u,int v)
{
	last[u]->Xt=new Node;
	last[u]->Xt->Pr=last[u];
	last[u]=last[u]->Xt;
	last[u]->Name=v;
	last[u]->Xt=0;
}
void Initialize()
{
int i,St,En;
	fin>>n>>K;
	for(i=1;i<=n;i++)
		last[i]=&Map[i];
	for(i=1;i<n;i++)
	{
		fin>>St>>En;
		Add(St,En);
		Add(En,St);
	}
}
void DFS(int Pos)
{
Node *p,*tp;
	for(p=Map[Pos].Xt;p;p=p->Xt)
		if(!flag[p->Name])
		{
			flag[p->Name]=++Index;
			DFS(p->Name);
			statue[Pos]+=statue[p->Name];
		}
		else 
			tp=p;
	statue[Pos]+=1;
int temp=min(statue[Pos],tn-statue[Pos]);
	if(temp>Max)
	{
		Max=temp;
		Re=Pos;
		Tar=tp;
	}
}

void Solve()
{
int i,P;
	tn=n;P=1;
	for(i=1;i<K;i++)
	{
		memset(flag,0,sizeof(flag));
		memset(statue,0,sizeof(statue));
		Index=0;
		flag[i]=++Index;Max=-21000000;
		DFS(i);
		tn-=Max;
		fout<<Max<<" ";
		Node *p=Map[Tar->Name].Xt;
			while(p)
			{
				if(p->Name==Re)
				{
					if(p->Pr)
						p->Pr->Xt=p->Xt;
					if(p->Xt)
						p->Xt->Pr=p->Pr;
				}
				p=p->Xt;
			}
		if(Tar->Pr)
			Tar->Pr->Xt=Tar->Xt;
		if(Tar->Xt)
			Tar->Xt->Pr=Tar->Pr;
	}
	fout<<tn<<endl;
}

int main()
{
	Initialize();
	
	Solve();
	
	fin.close();
	fout.close();
	return 0;
}