社区讨论
这tm也能T?
CF1039DYou Are Given a Tree参与者 30已保存回复 35
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 32 条
- 当前快照
- 1 份
- 快照标识符
- @mj5pe71n
- 此快照首次捕获于
- 2025/12/14 20:30 2 个月前
- 此快照最后确认于
- 2025/12/17 22:30 2 个月前
正确的 做法,写法中规中矩,为何超时?
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 条回复,欢迎继续交流。
正在加载回复...