正题

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


题目大意

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

1≤n≤1051\leq n\leq 10^51≤n≤105


解题思路

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

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

之后考虑上根号分治,对于一个kkk的答案显然不会超过nk\frac{n}{k}kn​,所以可以当k≤nk\leq \sqrt nk≤n​的时候暴力做,然后由于答案递增,大于n\sqrt nn​的kkk答案的取值不会超过n\sqrt nn​,每次二分断点即可。时间复杂度O(nnlog⁡n)O(n\sqrt n\log n)O(nn​logn)。

其实发现这样还是不够快,可以找到一个更好的阈值,设为TTT,那么前面的复杂度就是TTT,后面的复杂度就是nTlog⁡n\frac{n}{T}\log nTn​logn,用平衡规划的思想当T=nTlog⁡nT=\frac{n}{T}\log nT=Tn​logn时最快,也就是T=nlog⁡nT=\sqrt{n\log n}T=nlogn​时最快了。


code

#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;
}

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

  1. Codeforces Round #507 (Div. 1) D. You Are Given a Tree 根号分治 + dp

    传送门 题意: 有一颗nnn个节点的树,其中一个简单路径集合被称为kkk合法当且仅当: 树的每个节点至多属于一条路径,且每条路径恰好包含kkk个点. 对于k∈[1,n]k\in [1,n]k∈[1,n ...

  2. 树链剖分 or 根号分治 + dfs序 + 树状数组 ---- CF1254 D. Tree Queries

    题目链接 题目大意: 问题转化: 很容易发现:假设修改的节点是vvv. 1.vvv的子树sonvson_vsonv​直接加上(n−size[sonv])n×d\frac{(n-size[son_v]) ...

  3. 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 xor (根号分治)

    xor There is a tree with nn nodes. For each node, there is an integer value a_ia​i​​, (1 \le a_i \le ...

  4. [CF587F]Duff is Mad[AC自动机+根号分治+分块]

    题意 给你 \(n\) 个串 \(s_{1\cdots n}\) ,每次询问给出 \(l,r,k\) ,问在 \(s_{l\cdots r}\) 中出现了多少次 \(s_k\) . \(n,q,\su ...

  5. 【CTSC2010】珠宝商【后缀自动机】【点分治】【根号分治】

    题意:给一棵 nnn 个点的树,每个点有个字符,另给一个长度为 mmm 的特征串,求树上 n2n^2n2 条有向路径在特征串中出现的次数之和. n,m≤5×104n,m\leq 5\times 10^ ...

  6. 【UOJ549】序列妙妙值【异或】【根号分治】

    题意:给一个长度为nnn的序列aaa,将其分成kkk段,不能为空,求所有段的异或和之和的最小值. n≤6×104,ai<216,k≤8n\leq 6\times 10^4,a_i <2^{ ...

  7. 基站建设(三元环计数+根号分治 / bitset)

    基站建设 problem solution code problem 给定 nnn 个地点,以及每个地点的可靠度 RiR_iRi​. 有 mmm 条光纤架,每一条连接两个不同的地点,且是双向的. 测试 ...

  8. CF1039E-Summer Oenothera Exhibition【LCT,根号分治】

    正题 题目链接:https://www.luogu.com.cn/problem/CF1039E 题目大意 给出nnn个数的序列,mmm次询问至少将这个序列分成多少段才能满足每一段的和不超过w−qiw ...

  9. CF587F-Duff is Mad【AC自动机,根号分治】

    正题 题目链接:https://www.luogu.com.cn/problem/CF587F 题目大意 给出nnn个字符串sss.qqq次询问给出l,r,kl,r,kl,r,k要求输出sl..rs_ ...

最新文章

  1. [转]SQL,LINQ,Lambda语法对照图
  2. Myeclipse中js文件中的乱码处理
  3. 干货盘点:神策数据深度用户案例传送门
  4. dos命令for用法详解
  5. c语言程序中的错误可分为,《C语言程序设计(本)》模拟试卷1.doc
  6. java mybatis XML文件中大于号小于号转义(转载)
  7. 构造函数属性赋值不用this案例
  8. 如何在Activiti中使用瞬态变量
  9. 标题在上边框中的html(fieldset标签)
  10. mysql一些基本sql操作_MySql数据库的一些基本操作---------------SQL语法
  11. The Brand New Function(CF-224C)
  12. 依赖注入有点_一文读懂Java控制反转(IOC)与依赖注入(DI)
  13. php 农历日历,php下实现农历日历的代码_php实例
  14. JRE 和 JDK历史版本是为了帮助开发
  15. 宏杉科技的“存储七项式”方法论
  16. 「 英雄哪里出来 」算法博客阅读指引
  17. word 导出编辑ftl_word文档转化成ftl文件
  18. Tableau自定义调色板
  19. 【Web技术】662- 玩转前端 Video 播放器
  20. 如何自己编写一个交通仿真软件(二)原野。

热门文章

  1. android 百度地图 在线建议查询,百度地图SDK-----百度地图在线建议查询,结合AutoCompleteTextView实现搜索下拉列表。...
  2. php大数组查找算法,PHP简单的数组查找算法分享
  3. php吞了throw错误,PHP 异常与错误处理
  4. 项目管理六大制约因素_用PCTS理念做好项目管理规划(优秀项目管理者必知)...
  5. kotlin中mainactivity无法直接调用xml中的控件_使用52North 客户端接口调用OGC WPS服务...
  6. jdbc连接mysql8的一些坑_mysql8.0 jdbc连接注意事项
  7. php怎么压缩文字,php实现的简单压缩英文字符串的代码
  8. discuz mysql data_Discuz!显示 Database Error的原因和解决方法
  9. typeorm_Nestjs 热更新 + typeorm 配置
  10. Java当中 文件得输入流 输出流