CF1039D-You Are Given a Tree【根号分治,贪心】

1|0正题

题目链接:https://www.luogu.com.cn/problem/CF1039D


1|1题目大意

给出n个点的一棵树,然后对于k[1,n]求每次使用一条长度为k的链覆盖树并且不能重复覆盖点时最大覆盖条数。

1n105


1|2解题思路

先考虑暴力怎么做,因为每条链的价值都是一,显然的一种贪心思想是能合并的就合并(没有让出一条链给另一条链腾空间的必要)。

这样的复杂度是O(n)的,但是对于每个都要求所以需要优化。

之后考虑上根号分治,对于一个k的答案显然不会超过nk,所以可以当kn的时候暴力做,然后由于答案递增,大于nk答案的取值不会超过n,每次二分断点即可。时间复杂度O(nnlogn)

其实发现这样还是不够快,可以找到一个更好的阈值,设为T,那么前面的复杂度就是T,后面的复杂度就是nTlogn,用平衡规划的思想当T=nTlogn时最快,也就是T=nlogn时最快了。


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int N=1e5+10; struct node{ int to,next; }a[N<<1]; int n,tot,cnt,dfn[N],ls[N],fa[N],f[N]; void addl(int x,int y){ a[++tot].to=y; a[tot].next=ls[x]; ls[x]=tot;return; } void dfs(int x){ dfn[++cnt]=x; for(int i=ls[x];i;i=a[i].next){ int y=a[i].to; if(y==fa[x])continue; fa[y]=x;dfs(y); } return; } int solve(int k){ if(k==1)return n; int ans=0; for(int i=1;i<=n;i++)f[i]=1; for(int i=n;i>=1;i--){ int x=dfn[i]; if(f[x]&&f[fa[x]]){ if(f[x]+f[fa[x]]>=k) ans++,f[fa[x]]=0; else f[fa[x]]=max(f[fa[x]],f[x]+1); } } return ans; } int main() { scanf("%d",&n); for(int i=1;i<n;i++){ int x,y; scanf("%d%d",&x,&y); addl(x,y);addl(y,x); } dfs(1); int T=sqrt((double)n*(log(n)/log(2))),last,z=T+1; for(int i=1;i<=T;i++)printf("%d\n",last=solve(i)); while(z<=n){ int l=z+1,r=n,k=solve(z); while(l<=r){ int mid=(l+r)>>1; if(solve(mid)<k)r=mid-1; else l=mid+1; } for(int i=z;i<=r;i++) printf("%d\n",k); z=r+1; } return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15343702.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(30)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示