CF1039D You Are Given a Tree 根号分治、二分、贪心
似乎直接做不太好做……
当你不会做的时候就可以考虑根号算法了(或许是这样的
考虑如果只有一个询问如何计算答案。
显然是可以贪心的,思路与NOIP2018D1T3是相同的。每一个点向上传一条链,对于某一个点,如果从儿子传上来的所有链中最长的两条的长度之和\(\geq k\)就连上,否则就把其中最长的那一条传上去。
然后考虑所有询问。
可以发现:对于链长\(>\sqrt{n}\)的所有询问,最多只有\(\sqrt{n}\)种答案。
所以对于链长\(\leq \sqrt{n}\)的询问暴力计算
对于链长\(> \sqrt{n}\)的询问,因为答案随着链长增加单调不降,所以可以二分。设当前计算到了\(j\),先算出\(j\)的答案,然后二分出答案与\(j\)相等的最大的\(k\),那么对于\(\forall i \in [j,k]\),链长为\(i\)的答案都相等,输出\(k-j+1\)次当前计算出的答案,然后继续计算\(k+1\)。
这个算法的复杂度是\(O(n\sqrt{n} + n\sqrt{n}logn)\)的,还不够优秀。
可以发现分治的两种计算的复杂度是不平均的,优化一下
设小于等于\(S\)时暴力,大于\(S\)时二分,那么复杂度为\(O(nS + n \frac{n}{S} logn)\),不难得到当\(S= \sqrt{nlogn}\)时有最优复杂度\(O(n\sqrt{nlogn})\)
注意:计算某一种链长的答案不要使用递归,应先处理好拓扑序然后递推,这样可以大大加快程序运行速度。
#include<bits/stdc++.h>
//This code is written by Itst
using namespace std;
inline int read(){
int a = 0;
char c = getchar();
bool f = 0;
while(!isdigit(c) && c != EOF){
if(c == '-')
f = 1;
c = getchar();
}
if(c == EOF)
exit(0);
while(isdigit(c)){
a = (a << 3) + (a << 1) + (c ^ '0');
c = getchar();
}
return f ? -a : a;
}
const int MAXN = 1e5 + 10;
struct Edge{
int end , upEd;
}Ed[MAXN << 1];
int head[MAXN] , cur[MAXN] , top[MAXN] , fa[MAXN] , N , T , cntEd , ans , ts;
inline void addEd(int a , int b){
Ed[++cntEd].end = b;
Ed[cntEd].upEd = head[a];
head[a] = cntEd;
}
void input(){
N = read();
T = sqrt(N * log2(N));
for(int i = 1 ; i < N ; ++i){
int a = read() , b = read();
addEd(a , b);
addEd(b , a);
}
}
void init(int x , int p){
fa[x] = p;
top[++ts] = x;
for(int i = head[x] ; i ; i = Ed[i].upEd)
if(Ed[i].end != p)
init(Ed[i].end , x);
}
void solve(int q){
ans = 0;
fill(cur + 1 , cur + N + 1 , 1);
for(int i = N ; i > 1 ; --i){
int x = top[i];
if(cur[fa[x]] != -1 && cur[x] != -1){
if(cur[fa[x]] + cur[x] >= q){
cur[fa[x]] = -1;
++ans;
}
else
cur[fa[x]] = max(cur[fa[x]] , cur[x] + 1);
}
}
}
void work(){
printf("%d\n" , N);
for(int i = 2 ; i <= T ; ++i){
solve(i);
printf("%d\n" , ans);
}
for(int j = T + 1 ; j <= N ; ){
solve(j);
int cur = ans , L = j , R = N;
while(L < R){
int mid = (L + R + 1) >> 1;
solve(mid);
if(ans == cur)
L = mid;
else
R = mid - 1;
}
while(j <= L){
++j;
printf("%d\n" , cur);
}
}
}
int main(){
input();
init(1 , 0);
work();
return 0;
}
CF1039D You Are Given a Tree 根号分治、二分、贪心的更多相关文章
- 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[贪心+根号分治]
题意 给你\(n\)个点的树,其中一个简单路径的集合被称为\(k\)合法当且仅当树的每个节点最多属于一条路径,且每条路径包含\(k\)个节点.对于每个\(k(k \in [1,n])\),输出最多的\ ...
- CF804D Expected diameter of a tree 树的直径 根号分治
LINK:Expected diameter of a tree 1e5 带根号log 竟然能跑过! 容易想到每次连接两个联通快 快速求出直径 其实是 \(max(D1,D2,f_x+f_y+1)\) ...
- CF1039D-You Are Given a Tree【根号分治,贪心】
正题 题目链接:https://www.luogu.com.cn/problem/CF1039D 题目大意 给出\(n\)个点的一棵树,然后对于\(k\in[1,n]\)求每次使用一条长度为\(k\) ...
- 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 ...
- BZOJ.4320.[ShangHai2006]Homework(根号分治 分块)
BZOJ \(\mathbb{mod}\)一个数\(y\)的最小值,可以考虑枚举剩余系,也就是枚举区间\([0,y),[y,2y),[2y,3y)...\)中的最小值(求后缀最小值也一样)更新答案,复 ...
- [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$的所有满足 ...
随机推荐
- 转: Laravel 自定义公共函数的引入
来源:Laravel 自定义公共函数的引入 背景习惯了 使用 ThinkPHP 框架,有一个公共方法类在代码编写上会快捷很多,所以有必要在此进行配置一番.测试框架:Laravel 5.5步骤指导1. ...
- Web.config配置customErrors mode为Off后依然不显示具体错误的可能原因。
有时候我们的网站程序在本地运行没有问题,但在上传到远程服务器后则报错.这就需要我们了解具体错误,但IIS默认只显示统一的运行时错误,想要知道具体错误就需要配置Web.config中customErro ...
- iOS-WKWebView的使用
参考文章:http://www.cocoachina.com/ios/20180831/24753.html WK时苹果在iOS8.0之后推出的控件,相比于UIWebView: 内存消耗少: 解决了网 ...
- maven(二):创建一个可用的maven项目,完整过程
环境:eclipse4.5 (内置maven插件) 创建maven项目 文件菜单--新建--其他-- maven project 下一步 选择web 结构 group id: 指项目在maven本地 ...
- 用Python实现数据结构之二叉搜索树
二叉搜索树 二叉搜索树是一种特殊的二叉树,它的特点是: 对于任意一个节点p,存储在p的左子树的中的所有节点中的值都小于p中的值 对于任意一个节点p,存储在p的右子树的中的所有节点中的值都大于p中的值 ...
- 3.6Python数据处理篇之Numpy系列(六)---Numpy随机函数
目录 目录 前言 (一)基础的随机函数 (二)轴的随机函数 (三)概率的随机函数 目录 前言 前一段日子学了numpy,觉得无趣,没有学完,不过后来看了看matplotlib,sympy等库时,频频用 ...
- jsp 一点点
jsp学习 jsp -处理 作为正常的页面,你的浏览器发送一个http请求道web服务器. web 服务器承认一个JSP页面的HTTP请求,并将其转发给一个JSP引擎. JSP引擎从磁盘加载JSP页面 ...
- MapReduce全局变量之捉虫记
全局变量 写MapReduce程序时候,有时候须要用到全局变量,经常使用的全局变量实现由三种方式: 通过作业的Configuration传递全局变量.作业初始化的时候.conf.set(),须要的时候 ...
- 关于var与function的解析顺序问题
先给几段代码,看看你能知道运行结果不 function example1() { var f = function() {return 1;}; return f; var f = function( ...
- SSM搭建一个后台管理系统
看一下效果图: 登陆界面: 图片上传页面: 我也把项目放到服务器上了,可以直接查看项目内容: http://codingcoge.cn/ssm-demo/login.html 1 我也放到github ...