CF1039D You Are Given a Tree

written on 2022-05-25

一道根号分治的毒瘤题。

这题和之前写过的CF786C Till I Collapse是同一类型的题目,那题题解好像写在某天比赛的总结里了。

这类题最显著的特征有两个:

  1. 答案的单调性。观察样例便容易发现这一结论,再稍加思考即可证明其正确性。

  2. 对于每一个位置的答案,最大不超过 n÷k,这样一来,对于 >nk,答案就不会多于 n 个,于是就可以采用二分同一答案的最右端,然后一起输出。

此题的另一个问题在于暴力的写法。这里有一个显然的贪心,即 如果该点能与下面的两最大儿子组成 k 的链,那就优先考虑组链,不行的话就取最大值更新链长。

另外:此题卡常!!优化方式主要有如下几点:

  1. 快读快写。

  2. 使用内联函数 inline。

  3. 将所有结点预先按照 dfs序排好,这样计算时就不需递归以达到优化目的。(这点最重要!)

  4. 块长的处理,取 nlogn 时最优,具体证明可以参考其它题解。(这点也很重要!)

#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,十分的蒻

posted @   Freshair_qprt  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示