F. Dominant Indices
题意:求每个点的子树中哪一层节点数最多,如果有节点数最多不唯一,取层数最小的。
题解:dus on tree
基本想法是对每一个节点都构建一个deep数组,然后从底向上更新过来,但是这样空间复杂度和时间复杂度都会是O(n^2)无法承受。
然后向办法共用deep数组和记录其数值的数组,那么这时候对于一个节点来说,如果他每次都要重新遍历他所有的子节点,那么时间复杂度仍是O(n^2),所以考虑保留他某个儿子的火种,那当然是保留其子树最大的儿子节点了,所以每次先dfs其不是子数最大的儿子的节点,而后遍历子数最大的儿子节点,这个顺序不能反,因为你要对先遍历的清空,这是由于你共用了数组,所以每次访问前都要清空cnt数组,但是最后一个可以不清空,因为他没有别的儿子要访问了。
复杂度分析:由于重链是直接继承(大儿子最后访问不清空)的关系,也就是O(1)就可以了,考虑轻链,对于某个点来说,他一直跑一直跑到根节点,至多经过logn条轻链,因为每条轻链都会导致节点总数目*2,所以是logn条,所以总复杂度就是nlogn了
算法的关键点就是利用了重链轻链的思想,重用了数组,适用于查询所有节点的题目。
https://codeforces.com/blog/entry/44351 //codeforce博客链接
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+;
vector<int>G[N];
int n,sz[N],deep[N],c[N],ans[N];
void getsz(int x,int f,int dt){
sz[x]=;
deep[x]=dt;
for(int i=;i<(int)G[x].size();++i) {
int v=G[x][i];
if(v==f) continue;
getsz(v,x,dt+);
sz[x]+=sz[v];
}
}
int mx,id;
void mdy(int x,int y){
c[x]+=y;
if(c[x]>mx) mx=c[x],id=x;
if(c[x]==mx&&x<id) id=x;
}
void add(int u,int p,int x){
mdy(deep[u],x);
for(int i=;i<(int)G[u].size();++i){
int v=G[u][i];
if(v==p) continue;
add(v,u,x);
}
}
void dfs(int u,int p,bool keep){
int big=-,now=;
for(int i=;i<(int)G[u].size();++i) {
int v=G[u][i];
if(v==p) continue;
if(sz[v]>now) now=sz[v],big=v;
}
for(int i=;i<(int)G[u].size();++i) {
int v=G[u][i];
if(v==big||v==p) continue;
dfs(v,u,);
}
if(~big) dfs(big,u,);
mdy(deep[u],);
for(int i=;i<(int)G[u].size();++i) {
int v=G[u][i];
if(v==big||v==p) continue;
add(v,u,);
}
ans[u]=id;
if(!keep){
mdy(deep[u],-);
for(int i=;i<(int)G[u].size();++i){
int v=G[u][i];
if(v==p) continue;
add(v,u,-);
}
mx=id=;
}
}
int main(){
int x,y;
scanf("%d",&n);
for(int i=;i<n;++i) {
scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
getsz(,,);
dfs(,,);
for(int i=;i<=n;++i) printf("%d\n",ans[i]-deep[i]);
}
F. Dominant Indices的更多相关文章
- Codeforces 1009 F - Dominant Indices
F - Dominant Indices 思路:树上启发式合并 先跑轻子树,然后清除轻子树的信息 最后跑重子树,不清除信息 然后再跑一遍轻子树,重新加回轻子树的信息 由于一个节点到根节点最多有logn ...
- Codeforces 1009 F. Dominant Indices(长链剖分/树上启发式合并)
F. Dominant Indices 题意: 给一颗无向树,根为1.对于每个节点,求其子树中,哪个距离下的节点数量最多.数量相同时,取较小的那个距离. 题目: 这类题一般的做法是树上的启发式合并,复 ...
- Educational Codeforces Round 47 (Rated for Div. 2)F. Dominant Indices 线段树合并
题意:有一棵树,对于每个点求子树中离他深度最多的深度是多少, 题解:线段树合并快如闪电,每个节点开一个权值线段树,递归时合并即可,然后维护区间最多的是哪个权值,到x的深度就是到根的深度减去x到根的深度 ...
- CF 1009 F Dominant Indices —— 长链剖分+指针
题目:http://codeforces.com/contest/1009/problem/F 也可以用 dsu on tree 的做法,全局记录一个 dep,然后放进堆里,因为字典序要最小,所以再记 ...
- 【CF1009F】Dominant Indices(长链剖分)
[CF1009F]Dominant Indices(长链剖分) 题面 洛谷 CF 翻译: 给定一棵\(n\)个点,以\(1\)号点为根的有根树. 对于每个点,回答在它子树中, 假设距离它为\(d\)的 ...
- CF1009F Dominant Indices 解题报告
CF1009F Dominant Indices 题意简述 给出一颗以\(1\)为跟的有根树,定义\(d_{i,j}\)为以\(i\)为根节点的子树中到\(i\)的距离恰好为\(j\)的点的个数,对每 ...
- [CF1009F] Dominant Indices (+dsu on tree详解)
这道题用到了dsu(Disjoint Set Union) on tree,树上启发式合并. 先看了CF的官方英文题解,又看了看zwz大佬的题解,差不多理解了dsu on tree的算法. 但是时间复 ...
- 【Cf Edu #47 F】Dominant Indices(长链剖分)
要求每个点子树中节点最多的层数,一个通常的思路是树上启发式合并,对于每一个点,保留它的重儿子的贡献,暴力扫轻儿子将他们的贡献合并到重儿子里来. 参考重链剖分,由于一个点向上最多只有$log$条轻边,故 ...
- CF1009F Dominant Indices(启发式合并)
You are given a rooted undirected tree consisting of nn vertices. Vertex 11 is the root. Let's denot ...
随机推荐
- 【Linux常见命令】echo命令
echo - display a line of text 打印输出内容的常用命令,可以结合重定向>和追加>>对文件进行覆盖或追加内容. 语法: echo [SHORT-OPTION ...
- 2018年要学习的10大Python Web框架
通过为开发人员提供应用程序开发结构,框架使开发人员的生活更轻松.他们自动执行通用解决方案,缩短开发时间,并允许开发人员更多地关注应用程序逻辑而不是常规元素. 在本文中,我们分享了我们自己的前十大Pyt ...
- codeforce 1311 D. Three Integers
In one move, you can add +1 or −1 to any of these integers (i.e. increase or decrease any number by ...
- CF--思维练习--CodeForces - 221C-H - Little Elephant and Problem (思维)
ACM思维题训练集合 The Little Elephant has got a problem - somebody has been touching his sorted by non-decr ...
- java程序猿面试系列之jvm专题
前言 因为疫情的影响,现在都变成金五银六了.为了方便大家,在此开一个程序猿面试系列.总结各大公司所问的问题,希望能够帮助到大家,适合初中级java程序猿阅读. 1. Java类实例化时,JVM执行顺序 ...
- 9) drf JWT 认证 签发与校验token 多方式登陆 自定义认证规则反爬 admin密文显示
一 .认证方法比较 1.认证规则图 django 前后端不分离 csrf认证 drf 前后端分离 禁用csrf 2. 认证规则演变图 数据库session认证:低效 缓存认证:高效 jwt认证:高效 ...
- js数组中返回具有某个属性具有特定值的对象
const drDataArr = [{ date: 0, type: '心率', value: 82 },{ date: 1, type: '心率', value: 80 },{ date: 2, ...
- awk调用date命令
创建文件date.awk: $ == { cmd = "\"" while (cmd | getline line) { print line } close(cmd) ...
- 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543
学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...
- 聊聊算法——BFS和DFS
如果面试字节跳动和腾讯,上来就是先撕算法,阿里就是会突然给你电话,而且不太在意是周末还是深夜, 别问我怎么知道的,想确认的可以亲自去试试.说到算法,直接力扣hard三百题也是可以的,但似乎会比较伤脑, ...