题目

给定一棵树,对于 \(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. 用宝塔设立分发Directory.Build.props及其Import文件的网站

    新建站点 服务器名称我们约定是dev.amihome.cn 创建的默认站点有下面4个文件 把本地的文件,用宝塔上传 上图我们是把本地的Directory.Build.props文件上传到了网站的根目录 ...

  2. NodeJS本地公用类库

    git + npm link 先来看一下npm install 文档. npm 支持安装 git 仓库,支持 git , git+ssh , git+http , git+https , or git ...

  3. 【Azure 应用服务】App Service 默认页面暴露Tomcat版本信息,存在安全风险

    问题描述 在创建Azure App Service时,服务端的配置使用Java 8 + Tomcat 8.5.默认的根目录页面显示出App Service Tomcat版本信息,存在一定的安全隐患. ...

  4. 【Azure 应用服务】如何让App Service 支持 Delete 方法 

    问题描述 如何让webapp 支持 delete 方法? 在不修改设置的情况下,调用DELETE方法出现405错误 - 方法不被允许 问题解决 基于当前App Service在Windows的环境中运 ...

  5. Java对象引用和内存管理的细节

    在Java中,当局部变量(比如方法参数)的作用域结束时,这个局部变量的引用确实不再存在,但这并不意味着它引用的对象会被销毁.对象的销毁是由Java的垃圾回收器(Garbage Collector, G ...

  6. 来也科技收购Mindsay背后:新旧势力交锋智能自动化备受关注

    来也科技收购Mindsay背后:新旧势力交锋智能自动化备受关注 来也科技收购Mindsay背后:历程一波三折,意义非同寻常 来也科技收购Mindsay,国产RPA正式进军国际市场 收购Mindsay来 ...

  7. 从零开始学Spring Boot系列-集成mybatis

    在Spring Boot的应用开发中,MyBatis是一个非常流行的持久层框架,它支持定制化SQL.存储过程以及高级映射.在本篇文章中,我们将学习如何在Spring Boot项目中集成MyBatis, ...

  8. ECharts 中国地图 vue

    <template> <div> <div id="china_map_box"> <div id="china_map&quo ...

  9. C#项目管理引用的dll文件

    这篇文章主要简单记录一下C#项目的dll文件管理方法,以便后期使用. 设置dll路径 参考C#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁中间的 方法一:配置App.config文件的pri ...

  10. 基于恒玄BES2600的轻量级鸿蒙操作系统AIOT开发平台解析之SDK下载和编译

    一 鸿蒙系统 华为鸿蒙系统是一款全新的面向全场景的分布式操作系统,创造一个超级虚拟终端互联的世界,将人.设备.场景有机地联系在一起, 将消费者在全场景生活中接触的多种智能终端实现极速发现.极速连接.硬 ...