Codeforces Global Round 6 F

https://codeforces.com/contest/1266/problem/F

特判一些极端如almost-1和集合中仅存两点的情况

大致分两种情况

最终集于某一点或两点

这些点分立不同子树

那么处理每个点为根不同子树的最远距离

显然的,若最远距离为d,可选取[1,d]的距离

1.一点

又可分为

A.1条长度为k,s条长度为k+1的

s+1更新ans[2k+1]

B.s条长度为k的

s更新ans[2k]和ans[2k-1]

2.两点

s1条长度为k的到u点

s2条长度为k的到v点

s1+s2更新 ans[2k]

#include
#define file(KSCN) freopen(KSCN".in","r",stdin),freopen(KSCN".out","w",stdout)
using namespace std;
typedef long long ll;
namespace IO{
	const int ios=1<<17;
	char R[ios],*Rc=R,*RB=R;int pass;
	inline int gec(){return(Rc==RB&&(RB=(Rc=R)+fread(R,1,ios,stdin),Rc==RB))?EOF:*Rc++;}
	templateinline int read(Tp&A){
		static int c,sg;c=gec();sg=0;A=0;
		while(!isdigit(c)&&c!=EOF)sg|=(c=='-'),c=gec();
			if(c==EOF)return EOF;
		while(isdigit(c))A=(A<<3)+(A<<1)+(c^'0'),c=gec();
		return A=sg?-A:A,0;
	}
	inline int read(){return read(pass),pass;}
}
using IO::gec;using IO::read;
const int N=5e6+5;
templatevoid cmax(T&a,T b){if(b>a)a=b;}
typedef pair par;
vectore[N];
vector< par >a[N];
int du[N],up[N],res[N];
int n;
void DFS1(int x,int FAQ){
	for(int to:e[x])if(to!=FAQ)
		DFS1(to,x),cmax(du[x],du[to]+1);
}
void DFS2(int x,int upon){
	par b[2];
	b[0]=make_pair(up[x]=(upon+1),-1);
	b[1]=make_pair(-1,-1);
	for(int to:e[x])if(du[to]b[k])swap(su,b[k]); 
	}
	for(int to:e[x])if(du[to]cur;
	for(int x=0;x0)cmax(res[(a[x][i-1].first<<1)+1],sum+1);//>=i & single (i-1)
			cmax(res[(a[x][i].first<<1)],sum);
			sum-=a[x][i].second;
		}
	}
	for(int x=0;x=1;i--)cmax(res[i],res[i+2]);
	for(int i=1;i<=n;i++)printf("%d ",res[i]);
	return 0;
}

 

你可能感兴趣的:(DFS)