社区讨论

这tm也能T?

CF1039DYou Are Given a Tree参与者 30已保存回复 35

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
32 条
当前快照
1 份
快照标识符
@mj5pe71n
此快照首次捕获于
2025/12/14 20:30
2 个月前
此快照最后确认于
2025/12/17 22:30
2 个月前
查看原帖
正确的 O(nnlogn)O(n \sqrt {n\log n}) 做法,写法中规中矩,为何超时?
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int bl=1300;
int n,ans[N];
vector<int> e[N];
struct dp{
	int f[N],g[N];
	void dfs(int u,int fa,int k){
		int mx1=0,mx2=0,sum=0;
		for(int v:e[u]){
			if(v==fa) continue;
			dfs(v,u,k);
			sum+=f[v];
			if(g[v]>mx1){
				mx2=mx1;
				mx1=g[v];
			}
			else if(g[v]>mx2){
				mx2=g[v];
			}
		}
		if(mx1+mx2+1>=k){
			f[u]=sum+1;
			g[u]=0;
		}
		else{
			f[u]=sum;
			g[u]=mx1+1;
		}
	}
	int sol(int k){
		*this=dp();
		dfs(1,0,k);
		return f[1];
	}
}t;
int get_le(int k){
	int le=1,ri=n+1,mid;
	while(le<ri){
		mid=(le+ri)>>1;
		int w=t.sol(mid);
		if(w>k) le=mid+1;
		else ri=mid;
	}
	return le;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n;
	for(int i=1;i<n;i++){
		int x,y;
		cin>>x>>y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	for(int i=1;i<=bl;i++){
		ans[i]=t.sol(i);
	}
	int h[N]={};
	for(int i=0;i<=n/bl+1;i++){
		h[i]=get_le(i);
	}
	for(int i=0;i<=n/bl+1;i++){
		int l=h[i];
		int r=((i==0)?(n):(h[i-1]-1));
		for(int j=l;j<=r;j++){
			ans[j]=i;
		}
	}
	for(int i=1;i<=n;i++){
		cout<<ans[i]<<"\n";
	}
}

回复

35 条回复,欢迎继续交流。

正在加载回复...