可爱妹子 30分代码求助QAQ
查看原帖
可爱妹子 30分代码求助QAQ
554803
After_light楼主2024/9/14 14:40

帅哥教教妹子/ll/ll/ll

给个hack也可以啊/ll

#include<bits/stdc++.h>
#define sit set<int>::iterator 
#define F(i,a,b) for(int i=a;i<=b;i++)
#define R(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=1e6+7;
int n,head[N],cnt,b[N],f[N],tot,ans=1,len[N];
multiset<int> s;
struct edge{
	int nxt,to;
	edge(int _nxt=0,int _to=0){
		nxt=_nxt,to=_to;
	}
}e[N];
bool thy;
inline void add_edge(int from,int to){
	e[++cnt]=edge(head[from],to);
	head[from]=cnt;
}
inline void dfs(int now,int fa){
	int ch=0;
	for(int i=head[now];i;i=e[i].nxt){
		if(e[i].to==fa) continue;
		dfs(e[i].to,now);
		ch++;
		f[now]+=f[e[i].to];
	}
	if(ch%2==1){
		for(int i=head[now];i;i=e[i].nxt){
			if(e[i].to==fa) continue;
			len[now]=min(len[now],len[e[i].to]+1);
		}
		ans=max(ans,len[now]);
	}
	else len[now]=0;
	b[now]=ch%2;
	tot=0;
	for(int i=head[now];i;i=e[i].nxt){
		if(e[i].to==fa) continue;
	}
	f[now]+=ch/2;
}
inline void dfs2(int now,int fa,int val){
	for(int i=head[now];i;i=e[i].nxt){
		if(e[i].to==fa) continue;
		dfs2(e[i].to,now,val);
	}
	tot=0;
	for(int i=head[now];i;i=e[i].nxt){
		if(e[i].to==fa) continue;
		s.insert(len[e[i].to]);
		tot++;
	}
//	if(val==2) cout<<"now:"<<now<<"\n";
	int kik=0;
	while(s.size()){
		int val1=*(--s.end());
		if(s.size()==1){
			kik++;
			len[now]=val1+1;
			break;
		}
//		if(val==2)
//			for(auto i:s){
//				cout<<i<<" ";
//			}
//		if(val==2) cout<<"\n";
		s.erase((--s.end()));
		sit val2i=s.upper_bound(val-val1-2);
		if(val2i==s.end()){
			if(*(--s.end())+val1+2<=val){
//				cout<<"1"<<val1<<"\n";
				s.erase(--s.end());
			}
			else{
				kik++;
//				cout<<"2"<<val1<<"\n";
				len[now]=val1+1;
			}
		}
		else{
			int val2=*val2i;
//			cout<<"3"<<val1<<"\n";
			if(--val2i!=s.begin()){
				s.erase(--val2i);
			}
			else{
				kik++;
				len[now]=val1+1;
			}
		}
	} 
//	cout<<kik<<" "<<len[now]<<"\n";
	if(kik>2||(kik==2&&now==1)||(kik==2&&b[now]==1)){
		thy=false;
	}
	s.clear();
	if(len[now]>val) thy=false;
}
int main(){
	cin>>n;
	F(i,1,n-1){
		int from,to;
		cin>>from>>to;
		add_edge(from,to);
		add_edge(to,from);
	}
	dfs(1,0);
	int l=0,r=n,ans;
	while(l<=r){
		int mid=(l+r)>>1;
		F(i,1,n) len[i]=0;
//		cout<<mid<<"\n";
		thy=true;
		dfs2(1,0,mid);
		if(thy) r=mid-1,ans=mid;
		else l=mid+1;
	}
//	cout<<"KINGKINGKING!!!!!!!!!!!!!!!\n";
//	thy=true;
//	puts("");
//	dfs2(1,0,2);
//	F(i,1,n){
//		cout<<len[i]<<" ";
//	}
//	cout<<"\n";
//	cout<<thy<<" THY\n";
	cout<<f[1]+b[1]<<" "<<ans<<"\n";
	return 0;
}

2024/9/14 14:40
加载中...