cf1009F. Dominant Indices

题意:

1号节点为根,问对于以每个点为根的子树种,求某个深度节点最多的层数。如果多个相等,输出深度小的。

题解:

直接dsu就完事了,相当于是求子树的众数,但是注意常数,一开始因为常数过大在第100点wa了
将可以合并的dfs套在一起写,减少常数
好像线段树合并也可以做,但我还不会emm

代码:

// Problem: F. Dominant Indices
// Contest: Codeforces - Educational Codeforces Round 47 (Rated for Div. 2)
// URL: https://codeforces.com/contest/1009/problem/F
// Memory Limit: 512 MB
// Time Limit: 4500 ms
// Data:2021-09-03 11:43:05
// By Jozky#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
void read(){};
template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar)
{x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...);
}
template <typename T> inline void write(T x)
{if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0');
}
void rd_test()
{#ifdef LOCALstartTime= clock();freopen("in.txt", "r", stdin);
#endif
}
void Time_test()
{#ifdef LOCALendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
int n;
const int maxn= 2e6 + 9;
vector<int> vec[maxn];
int dep[maxn];
int siz[maxn];
int son[maxn];
int Son;
void dfs(int u, int fa)
{dep[u]= dep[fa] + 1;siz[u]= 1;for (auto v : vec[u]) {if (v == fa)continue;dfs(v, u);siz[u]+= siz[v];if (siz[v] > siz[son[u]])son[u]= v;}
}
int ans[maxn];
int num[maxn];
int Ans, Num;
void cal(int u, int fa, int val)
{num[dep[u]]+= val;if (val == 1) {if (num[dep[u]] > Num || (num[dep[u]] == Num && dep[u] < Ans)) {Ans= dep[u];Num= num[dep[u]];}}for (auto v : vec[u]) {if (v == fa || v == Son)continue;cal(v, u, val);}
}
// PII solve(int u, int fa, int rt)
// {// PII maxx;
// maxx.first= num[dep[u]];
// maxx.second= dep[u] - dep[rt];
// for (auto v : vec[u]) {// if (v == fa)
// continue;
// PII ans= solve(v, u, rt);
// if (ans.first > maxx.first) {// maxx.first= ans.first;
// maxx.second= ans.second;
// }
// if (ans.first == maxx.first) {// maxx.second= min(maxx.second, ans.second);
// }
// }
// return maxx;
// }
void dfs2(int u, int fa, int keep)
{for (auto v : vec[u]) {if (v == fa || v == son[u])continue;dfs2(v, u, 0);}if (son[u]) {dfs2(son[u], u, 1);Son= son[u];}cal(u, fa, 1);// PII p= solve(u, fa, u);ans[u]= Ans - dep[u];Son= 0;if (!keep) {cal(u, fa, -1);Num= 0;Ans= 0;}
}
int main()
{//rd_test();read(n);for (int i= 1; i < n; i++) {int x, y;read(x, y);vec[x].push_back(y);vec[y].push_back(x);}dfs(1, 0);dfs2(1, 0, 0);for (int i= 1; i <= n; i++)printf("%d\n", ans[i]);//Time_test();
}

cf1009F. Dominant Indices相关推荐

  1. 【luogu CF1009F】Dominant Indices(长链剖分优化DP)

    Dominant Indices 题目链接:luogu CF1009F 题目大意 给你一棵以 1 为根的树,设 d(u,x) 为 u 子树总到 u 距离为 x 的点数. 然后要你对于每个点 x 都要求 ...

  2. 【CF1009F】 Dominant Indices (长链剖分+DP)

    题目链接 \(O(n^2)\)的\(DP\)很容易想,\(f[u][i]\)表示在\(u\)的子树中距离\(u\)为\(i\)的点的个数,则\(f[u][i]=\sum f[v][i-1]\) 长链剖 ...

  3. 【Cf Edu #47 F】Dominant Indices(长链剖分)

    要求每个点子树中节点最多的层数,一个通常的思路是树上启发式合并,对于每一个点,保留它的重儿子的贡献,暴力扫轻儿子将他们的贡献合并到重儿子里来. 参考重链剖分,由于一个点向上最多只有$log$条轻边,故 ...

  4. Dominant Indices(CF 1009 F)

    前言 记录一下长链剖分的小技巧 题目相关 链接 题目大意 一棵nnn个节点的树,定义fi,jf_{i,j}fi,j​为与iii号点距离为jjj的节点数量,对于每个iii求出一个最小的jjj满足fi,j ...

  5. [dsu on tree]树上启发式合并总结(算法思想及模板附例题练习)

    文章目录 前言 树上启发式合并 引入 算法思想 时间复杂度 模板 练习 例题:CF600E Lomsat gelral solution code CF208E Blood Cousins solut ...

  6. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  7. 树链剖分之长链剖分 详解 题目整理

    树链剖分 题目中出现的树链剖分一般分为两种,重链剖分和长链剖分 重链剖分:选择子树最大的儿子, 将其归入当前点所在 的同一条重链 长链剖分:选择向下能达到的深 度最深的儿子,将其归 入当前点所在的同一 ...

  8. Educational Codeforces Round 47 (Div 2) (A~G)

    目录 Codeforces 1009 A.Game Shopping B.Minimum Ternary String C.Annoying Present D.Relatively Prime Gr ...

  9. dsu on tree 题集 + ac代码

    文章目录 **入门讲解** **[600E - Lomsat gelral](https://codeforces.ml/problemset/problem/600/E)** **[树上数颜色](h ...

最新文章

  1. 基因组注释3.基因的功能注释Prokka
  2. Django View(视图系统)
  3. 内存稳定性测试_内存条选择两条8G还是单条16G?通过对比浅谈该如何选择
  4. 清除谷歌浏览器的dns缓存
  5. 绑定注意事项——数据源的属性
  6. 《Ext JS权威指南》——1.2节JSON概述
  7. java.servlet不存在_eclipse提示servlet不存在 的解决办法
  8. Vscode多个窗口显示多个选项卡/Tabs
  9. (1) 在manjaro linux下安装qq,微信
  10. 计算机网络奇偶校验码题目,计算机网络试题(考试必备)分解.doc
  11. 解决笔记本WIFI共享网络给黑群晖
  12. ElasticSearch: 使用Java Api 操作 ES
  13. Java 基础系列(七) --- 透彻学习Java的接口
  14. 使用mybaisplus时使用LambdaQueryWrapper进行条件查询发生evaluating expression异常处理
  15. 圆通快递单号免费查询接口,附带开发源码
  16. Sqldbx连接OracleX64位
  17. html:checkbox无法uncheck
  18. Dev-C++5.11游戏创作之简易小炸弹
  19. RV1126RV1109 buildroot 增加QT程序
  20. 【Hive+MySQL+Python】淘宝用户购物行为数据分析项目

热门文章

  1. 震撼世界的基建狂魔,中国制造的超级工程到底有多牛?
  2. 网友半夜差点被沐浴露吓死,众人:原来不止我胆小....
  3. 图像还可以这样玩!如何用OpenCV处理图像?
  4. 和爸爸的聊天永远是个谜。。 | 今日最佳
  5. 100 万在中国不同地方能活多久?
  6. Java类集-list
  7. android宿舍管理系统源码,基于android操作系统的手机宿舍管理系统使用手册
  8. ctf php sql注入,CTF—攻防练习之HTTP—SQL注入(SSI注入)
  9. python获取系统时间函数_简单记录python的时间函数操作
  10. 数据结构——二叉树的层次遍历进阶