CF1039D You Are Given a Tree
written on 2022-05-25
一道根号分治的毒瘤题。
这题和之前写过的CF786C Till I Collapse是同一类型的题目,那题题解好像写在某天比赛的总结里了。
这类题最显著的特征有两个:
-
答案的单调性。观察样例便容易发现这一结论,再稍加思考即可证明其正确性。
-
对于每一个位置的答案,最大不超过
,这样一来,对于 的 ,答案就不会多于 个,于是就可以采用二分同一答案的最右端,然后一起输出。
此题的另一个问题在于暴力的写法。这里有一个显然的贪心,即 如果该点能与下面的两最大儿子组成
另外:此题卡常!!优化方式主要有如下几点:
-
快读快写。
-
使用内联函数 inline。
-
将所有结点预先按照 dfs序排好,这样计算时就不需递归以达到优化目的。(这点最重要!)
-
块长的处理,取
时最优,具体证明可以参考其它题解。(这点也很重要!)
#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n;
int tot,ver[N<<1],nxt[N<<1],head[N];
inline void add_E(int x,int y){ver[++tot]=y,nxt[tot]=head[x],head[x]=tot;}
int mx[N],dfn[N],fa[N];
struct F{int id,dfn;}a[N];
bool cmp(F a,F b){return a.dfn>b.dfn;}
inline int read()
{
int x=0;char c=getchar();bool f=0;
while(!isdigit(c)){if(c=='-') f=1;c=getchar();}
while(isdigit(c)){x=(x<<3)+(x<<1)+c-48;c=getchar();}
if(f) x=-x;return x;
}
inline void write(int x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
void dfs(int x)
{
a[x].id=x;
a[x].dfn=++tot;
for(int i=head[x];i;i=nxt[i])
{
int y=ver[i];
if(y==fa[x]) continue;
fa[y]=x;
dfs(y);
}
}
inline int calc(int w)
{
int res=0;
for(int i=1;i<=n;i++)
{
int x=a[i].id,mx1=0,mx2=0;
for(int j=head[x];j;j=nxt[j])
{
int y=ver[j];
if(y==fa[x]) continue;
if(mx[y]>mx1) mx2=mx1,mx1=mx[y];
else if(mx[y]>mx2) mx2=mx[y];
}
if(mx1+mx2+1>=w) res++,mx[x]=0;
else mx[x]=mx1+1;
}
return res;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<n;i++)
{
int x,y;
x=read(),y=read();
add_E(x,y),add_E(y,x);
}
tot=0,dfs(1);
sort(a+1,a+1+n,cmp);
int B=sqrt(n*log2(n));
for(int i=1;i<=B;i++) write(calc(i)),puts("");
int x=B+1;
while(x<=n)
{
// printf("x=%d\n",x);
int now=calc(x);
int l=x+1,r=n,res=x;
while(l<=r)
{
int mid=l+r>>1;
if(calc(mid)==now) l=mid+1,res=mid;
else r=mid-1;
}
for(int i=1;i<=res-x+1;i++) write(now),puts("");
x=res+1;
}
}
我的代码最慢的第8个点跑了3.54s,十分的蒻
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具