题目

给定一棵树,对于 \(k\in [1,n]\) 问最多可以分成多少段长度为 \(k\) 的不交路径


分析

首先考虑对于单个 \(k\) 怎么做。

设 \(dp[x]\) 表示点 \(x\) 往下最多能伸出多长,那么 \(dp[x]=\max\{dp[y]+1\}\)。

如果 \(dp[x]+dp[y]\geq k\) 那么标记 \(x\) 这个点不能再选,这样贪心显然是正确的。

但是 \(O(n^2)\) 显然是不能接受的,考虑大于 \(\sqrt{n}\) 的部分答案一定小于 \(\sqrt{n}\)

那可以在根号内直接树形dp,根号外由于产生了很多相同段,直接二分即可。

时间复杂度为 \(O(nT+\frac{n^2\log n}{T})\) 当 \(T\) 取 \(\sqrt{n}\log{n}\) 时最优。


代码

#include <cstdio>
#include <cctype>
#include <cmath>
using namespace std;
const int N=100011;
struct node{int y,next;}e[N<<1];
int qp[N],fat[N],as[N],et=1,dp[N],ans[N],n,Top,bl;
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
void Max(int &a,int b){a=a>b?a:b;}
void dfs(int x,int fa){
for (int i=as[x];i;i=e[i].next)
if (e[i].y!=fa) dfs(e[i].y,x);
qp[++Top]=x,fat[x]=fa;
}
int answ(int k){
if (~ans[k]) return ans[k]; ans[k]=0;
for (int i=1;i<=n;++i) dp[i]=1;
for (int i=1;i<n;++i)
if (dp[qp[i]]>0&&dp[fat[qp[i]]]>0){
if (dp[fat[qp[i]]]+dp[qp[i]]>=k)
++ans[k],dp[fat[qp[i]]]=-1;
else Max(dp[fat[qp[i]]],dp[qp[i]]+1);
}
return ans[k];
}
int main(){
n=iut(),bl=sqrt(n*log(n)/log(2));
for (int i=1;i<=n;++i) ans[i]=-1;
for (int i=1;i<n;++i){
int x=iut(),y=iut();
e[++et]=(node){y,as[x]},as[x]=et;
e[++et]=(node){x,as[y]},as[y]=et;
}
dfs(1,0),ans[1]=n;
for (int i=2;i<=bl;++i) ans[i]=answ(i);
for (int l=bl+1;l<=n;++l){
int _l=l,r=n,now=answ(l);
while (l<r){
int mid=(l+r+1)>>1;
if (answ(mid)==now) l=mid;
else r=mid-1;
}
for (int j=_l;j<=l;++j) ans[j]=now;
}
for (int i=1;i<=n;++i) print(ans[i]),putchar(10);
return 0;
}

#根号分治,树形dp#CF1039D You Are Given a Tree的更多相关文章

  1. [BZOJ2152]聪聪可可 点分治/树形dp

    2152: 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MB Submit: 3602  Solved: 1858 [Submit][Status][Discu ...

  2. [codeforces161D]Distance in Tree(点分治/树形dp)

    题意:求树上距离为k的点对个数: 解题关键:练习一下点分治不用容斥 而直接做的做法.注意先查询,后更新. 不过这个方法有个缺陷,每次以一个新节点为根,必须memset mp数组,或许使用map会好些, ...

  3. BZOJ 2152 / Luogu P2634 [国家集训队]聪聪可可 (点分治/树形DP)

    题意 一棵树,给定边权,求满足两点之间的路径上权值和为3的倍数的点对数量. 分析 点分治板题,对每个重心求子树下面的到根的距离模3分别为0,1,2的点的个数就行了. O(3nlogn)O(3nlogn ...

  4. [集训队作业2018]蜀道难——TopTree+贪心+树链剖分+链分治+树形DP

    题目链接: [集训队作业2018]蜀道难 题目大意:给出一棵$n$个节点的树,要求给每个点赋一个$1\sim n$之内的权值使所有点的权值是$1\sim n$的一个排列,定义一条边的权值为两端点权值差 ...

  5. E. Alternating Tree 树点分治|树形DP

    题意:给你一颗树,然后这颗树有n*n条路径,a->b和b->a算是一条,然后路径的权值是 vi*(-1)^(i+1)  注意是点有权值. 从上头往下考虑是点分治,从下向上考虑就是树形DP, ...

  6. 『You Are Given a Tree 整体分治 树形dp』

    You Are Given a Tree Description A tree is an undirected graph with exactly one simple path between ...

  7. BZOJ4182 Shopping(点分治+树形dp)

    点分治,每次考虑包含根的连通块,做树形多重背包即可,dfs序优化.注意题面给的di范围是假的,坑了我0.5h,心态炸了. #include<iostream> #include<cs ...

  8. POJ 1741.Tree 树分治 树形dp 树上点对

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 24258   Accepted: 8062 Description ...

  9. BZOJ5341[Ctsc2018]暴力写挂——边分治+虚树+树形DP

    题目链接: CSTC2018暴力写挂 题目大意:给出n个点结构不同的两棵树,边有边权(有负权边及0边),要求找到一个点对(a,b)满足dep(a)+dep(b)-dep(lca)-dep'(lca)最 ...

  10. [WC2018]通道——边分治+虚树+树形DP

    题目链接: [WC2018]通道 题目大意:给出三棵n个节点结构不同的树,边有边权,要求找出一个点对(a,b)使三棵树上这两点的路径权值和最大,一条路径权值为路径上所有边的边权和. 我们按照部分分逐个 ...

随机推荐

  1. win32 - 关于GDI的RGB的数据分析

    此文章为小结,仅供参考. 第一种情况,从桌面DC获取RGBA的数据. 32位 HDC hdc, hdcTemp; RECT rect; BYTE* bitPointer; int x, y; int ...

  2. Golang Web 框架 Gin 基础学习教程集合目录

    Gin Web 框架基础学习系列目录 01-quickstart 02-parameter 03-route 04-middleware 05-log 06-logrus 07-bind 08-val ...

  3. 项目实战:Qt监测操作系统物理网卡通断v1.1.0(支持windows、linux、国产麒麟系统)

    需求   使用Qt软件开发一个检测网卡的功能.  兼容windows.linux,国产麒麟系统(同为linux) Demo   windows上运行:       国产麒麟操作上运行:       功 ...

  4. DataGear 制作自适应任意屏幕尺寸的数据可视化看板

    DataGear 即支持以编写HTML.JavaScript.CSS源码的源码模式制作看板,也支持直观可见.友好快捷的可视模式制作看板. 本文将通过看板可视编辑模式提供的网格布局和样式设置功能,介绍如 ...

  5. 【App Service】遇见本地访问Azure App Service应用慢或者是调用第三方接口慢的调试小工具

    问题描述 当应用部署到微软云 Azure后,如果遇见本地访问Azure App Service应用慢或者是调用第三方接口慢的时候,有什么好的调试方法呢? 来判断具体时那一段请求耗时呢? 问题解答 当然 ...

  6. 【Azure 应用服务】Azure App Service能否使用Storage Account File Share

    问题描述 Azure App Service能否使用Storage Account File Share? 问题回答 如果部署的App Service为Linux环境,可以直接使用Mount stor ...

  7. 【Azure Redis 缓存】Azure Cache for Redis 是否记录具体读/写(Get/Set)或删除(Del)了哪些key呢?

    问题描述 在Azure Redis的门户活动日志中,可以查看到的是对于Redis资源本身的操作.但是对于客户端连接到Redis服务后,对服务所做出的读写,或删除操作,是否有日志可以查看到呢? 问题回答 ...

  8. 浅入 ABP 系列(7):对象映射

    目录 基础 DTO和实体 麻烦的映射 AutoMapper 集成 IObjectMapper/ObjectMapper 对象拓展 写博客的过程中,发现很多基础理论太薄弱,因此很多专业词汇可能会解释错误 ...

  9. 李宏毅2022机器学习HW4 Speaker Identification上(Dataset &Self-Attention)

    Homework4 Dataset介绍及处理 Dataset introduction 训练数据集metadata.json包括speakers和n_mels,前者表示每个speaker所包含的多条语 ...

  10. sort自定义排序字符串('1-1','2-1','3-2'此类)

    对数组排序 ['2-3','2-1','1-4','3-2','1-1','2-2','3-1'] 直接使用原生sort 对对象排序 [{a:'2-3'},{a:'2-1'},{a:'1-4'},{a ...