[CF1039D]You Are Given a Tree[贪心+根号分治]
题意
给你\(n\)个点的树,其中一个简单路径的集合被称为\(k\)合法当且仅当树的每个节点最多属于一条路径,且每条路径包含\(k\)个节点。对于每个\(k(k \in [1,n])\),输出最多的\(k\)合法路径。
\(n\leq 10^5\)。
分析
先考虑 \(n^2\) 的做法,每次可以贪心地合并链,正确性显然。
考虑根号分治,\(k<\sqrt n\) 时 \(O(n)\) 暴力,否则因为取值是单调的可以二分,取值不超过 \(\frac{n}{\sqrt n}=\sqrt n\) 个。
总时间复杂度为 \(O(n\sqrt nlogn)\)。
因为这里两种操作的复杂度不均衡,所以可以把块的大小稍微调大。
根号分治的特点:\(x<\sqrt n\) 暴力个数和 \(x>\sqrt n\) 单个复杂度 \(\frac{n}{\sqrt n}=\sqrt n\)。
代码
#include<bits/stdc++.h>
using namespace std;
#define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].lst,v=e[i].to)
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pb push_back
typedef long long LL;
inline int gi(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch))	{if(ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
	return x*f;
}
template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
const int N=1e5 + 7;
int n,t1,low,edc;
int ans[N],mx[N],head[N],fa[N];
vector<int>gg;
struct edge{
	int lst,to;
	edge(){}edge(int lst,int to):lst(lst),to(to){}
}e[N*2];
void Add(int a,int b){
	e[++edc]=edge(head[a],b),head[a]=edc;
	e[++edc]=edge(head[b],a),head[b]=edc;
}
void dfs(int u){
	go(u)if(v^fa[u]) {
		fa[v]=u,dfs(v);
	}
	gg.pb(u);
}
int solve(int k){
	int res=0;
	rep(i,1,n) mx[i]=1;
	for(auto u:gg){
		if(fa[u]&&mx[fa[u]]!=-1&&mx[u]!=-1){
			if(mx[u]+mx[fa[u]]>=k) ++res,mx[fa[u]]=-1;
			else Max(mx[fa[u]],mx[u]+1);
		}
	}
	return res;
}
int main(){
#ifndef ONLINE_JUDGE
	freopen("data.in","r",stdin);
#endif
	n=gi();
	rep(i,1,n-1) Add(gi(),gi());
	int sz=min(400,n);
	dfs(1);
	ans[1]=n;
	rep(i,2,sz+1) ans[i]=solve(i);;
	for(int i=sz+1,j=sz+1;i<=n;i=j+1,j=i){
		int l=i,r=n,tmp=solve(i);
		while(l<r){
			int mid=l+r+1>>1;
			if(solve(mid)==tmp) l=mid;
			else r=mid-1;
		}
		j=l;
		rep(k,i,j) ans[k]=tmp;
	}
	rep(i,1,n) printf("%d\n",ans[i]);
	return 0;
}
												
											[CF1039D]You Are Given a Tree[贪心+根号分治]的更多相关文章
- CF1039D-You Are Given a Tree【根号分治,贪心】
		
正题 题目链接:https://www.luogu.com.cn/problem/CF1039D 题目大意 给出\(n\)个点的一棵树,然后对于\(k\in[1,n]\)求每次使用一条长度为\(k\) ...
 - CF1039D You Are Given a Tree 根号分治,贪心
		
CF1039D You Are Given a Tree LG传送门 根号分治好题. 这题可以整体二分,但我太菜了,不会. 根号分治怎么考虑呢?先想想\(n^2\)暴力吧.对于每一个要求的\(k\), ...
 - Codeforces 1039D You Are Given a Tree [根号分治,整体二分,贪心]
		
洛谷 Codeforces 根号分治真是妙啊. 思路 考虑对于单独的一个\(k\)如何计算答案. 与"赛道修建"非常相似,但那题要求边,这题要求点,所以更加简单. 在每一个点贪心地 ...
 - [CF1039D]You Are Given a Tree
		
[CF1039D]You Are Given a Tree 题目大意: 给定一棵\(n(n\le10^5)\)个节点的树.对于每一个正整数\(k(1\le k\le n)\),求最多能找出多少条包含\ ...
 - CF1039E Summer Oenothera Exhibition 贪心、根号分治、倍增、ST表
		
传送门 感谢这一篇博客的指导(Orzwxh) $PS$:默认数组下标为$1$到$N$ 首先很明显的贪心:每一次都选择尽可能长的区间 不妨设$d_i$表示在取当前$K$的情况下,左端点为$i$的所有满足 ...
 - CF804D Expected diameter of a tree 树的直径 根号分治
		
LINK:Expected diameter of a tree 1e5 带根号log 竟然能跑过! 容易想到每次连接两个联通快 快速求出直径 其实是 \(max(D1,D2,f_x+f_y+1)\) ...
 - CF1039E Summer Oenothera Exhibition 根号分治,LCT,ST表
		
CF1039E Summer Oenothera Exhibition LG传送门 根号分治好题. 可以先看我的根号分治总结. 题意就是给出长度为\(n\)的区间和\(q\)组询问以及一个\(w\), ...
 - 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 xor (根号分治)
		
xor There is a tree with nn nodes. For each node, there is an integer value a_iai, (1 \le a_i \le ...
 - hdu 4670 Cube number on a tree(点分治)
		
Cube number on a tree Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/ ...
 
随机推荐
- LeetCode题解之Leaf-Similar Trees
			
1.题目描述 2.问题分析 将叶子节点的值放入vector,然后比较. 3.代码 bool leafSimilar(TreeNode* root1, TreeNode* root2) { vector ...
 - IAM页面是在统一区分配的还是在混合区分配的?
			
IAM页面是在统一区分配的还是在混合区分配的? IAM页面的作用这里就不说了,网上的资料很多 文章中用到的工具:查看SQLSERVER内部数据页面的小插件Internals Viewer 先建立四张表 ...
 - python常用模块之subprocess
			
python常用模块之subprocess python2有个模块commands,执行命令的模块,在python3中已经废弃,使用subprocess模块来替代commands. 介绍一下:comm ...
 - Qt简介  及与MFC、GDK+的比较
			
Qt C++图形用户界面应用程序开发框架. Qt的由来和发展 1.QT由来 Haavard Nord 和Eirik Chambe-Eng于1991年开始开发"Qt",1994年3月 ...
 - NXlog配置
			
NXlog文档: http://nxlog.org/docs/nxlog-ce/nxlog-reference-manual.html https://nxlog.org/documentation/ ...
 - Python新建/删除文件夹
			
新建以当前日期为名的文件夹 import datetime,os,shutil today = datetime.datetime.now().date().strftime('%Y%m%d') pa ...
 - 50家硅谷IT公司技术博客
			
分享一下 50 家硅谷优秀 IT 公司技术博客,从中可以了解企业文化,技术特色和设计语言,如果直接列出来很单调,加上点评,算吐槽版吧. 知名大厂 1. Facebook https://www.f ...
 - 【Nginx】开启 gzip和缓存
			
Nginx 开启 gzip和缓存 时间:2016-09-23 16:42:37 nginx 是一个高性能的 Web 服务器,之前也写过一些关于 nginx 的文章.为了提高博客的响应速度,可以从设置 ...
 - SVN 图标不显示的解决办法
			
SVN 的图标没办法显示了.经搜索,发现需要修改注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Sh ...
 - jquery1.9 下检测浏览器类型和版本的方法
			
Jquery1.9版本中$.browser已被剔除: 判断浏览器类型: 复制代码 代码如下: $.browser.mozilla = /firefox/.test(navigator.userAgen ...