Codeforces 1009F Dominant Indices】的更多相关文章

传送门 长链剖分模板题. 题意:给出一棵树,设fi,jf_{i,j}fi,j​表示iii的子树中距离点iii距离为jjj的点的个数,现在对于每个点iii要求出使得fif_ifi​取得最大值的那个jjj. 思路:有一个明显的状态转移式fi,j=∑v∈sonifv,j−1f_{i,j}=\sum_{v\in son_i}f_{v,j-1}fi,j​=∑v∈soni​​fv,j−1​,那么考虑对这棵树长链剖分,对于链上的信息用指针实现O(1)O(1)O(1)转移,而链与链之间的转移直接暴力转就行,因为…
另类解法 将每一个节点拥有的各深度节点数量存在vector中,向上返回,这样不会占用过多的内存,以此判断最多节点相应的深度即可,但正常写最后一个数据会T,毕竟一次复制一个节点,相当于复制了(1+2+3+4+...+1e6)次,明显超时,所以特判一下1e6个节点的线性树,就算过了这个题了,,,但这个解法不算正规,最后一个数据改一下就又要T了,大家娱乐一下就好,,,23333 #include<iostream> #include<cstdio> #include<cmath&g…
一个比较显然的做法:对每棵子树用线段树维护其中的深度,线段树合并即可. 本来想用这个题学一下dsu on tree,结果还是弃疗了. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() { ,f=;char c…
F - Dominant Indices 思路:树上启发式合并 先跑轻子树,然后清除轻子树的信息 最后跑重子树,不清除信息 然后再跑一遍轻子树,重新加回轻子树的信息 由于一个节点到根节点最多有logn个轻边,所以复杂度为nlogn 代码: #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define pi acos(-1.0) #define LL long long //#def…
F. Dominant Indices 题意: 给一颗无向树,根为1.对于每个节点,求其子树中,哪个距离下的节点数量最多.数量相同时,取较小的那个距离. 题目: 这类题一般的做法是树上的启发式合并,复杂度是O(nlogn).但由于这题所求的信息与深度有关,因此可以使用长链剖分的技巧,复杂度可以是O(n). 长链剖分可以维护以深度为下标的信息.先预处理,以深度为依据,标记长儿子.维护答案时,对于每个节点,O(1)继承其长儿子的信息.然后暴力合并其他儿子.则时间复杂度是所有长链的长度之和,即O(n)…
E - Dominant Indices CodeForces - 1009F You are given a rooted undirected tree consisting of nn vertices. Vertex 11 is the root. Let's denote a depth array of vertex xx as an infinite sequence [dx,0,dx,1,dx,2,…][dx,0,dx,1,dx,2,…], where dx,idx,i is t…
[CF1009F]Dominant Indices(长链剖分) 题面 洛谷 CF 翻译: 给定一棵\(n\)个点,以\(1\)号点为根的有根树. 对于每个点,回答在它子树中, 假设距离它为\(d\)的点有\(f_d\)个,求最大的\(f_d\),并且输出\(d\),如果有多个\(f_d\)相同,输出最小的\(d\). 题解 这个东西和深度相关,很显然可以直接用长链剖分维护,时间复杂度\(O(N)\) 这道题目要维护的东西其实也很类似于\(dsu\ on\ tree\),但是复杂度会多个\(log…
CF1009F Dominant Indices 题意简述 给出一颗以\(1\)为跟的有根树,定义\(d_{i,j}\)为以\(i\)为根节点的子树中到\(i\)的距离恰好为\(j\)的点的个数,对每个点求出一个最小的\(j\)使得\(d_{i,j}\)最大 这个长链剖分的小trick感觉和树上分组背包的复杂度有点神似啊,据说和dsu on tree也有点像? 暴力的\(dp_{i,j}\)代表与\(i\)点相距为\(j\)的点的个数,复杂度\(O(n^2)\) 对每个点按重量维护重儿子,然后每…
这道题用到了dsu(Disjoint Set Union) on tree,树上启发式合并. 先看了CF的官方英文题解,又看了看zwz大佬的题解,差不多理解了dsu on tree的算法. 但是时间复杂度有点玄学,问了一下zwz大佬才懂了为什么是nlogn. 题目传送门 先考虑暴力n^2的算法. 显然对于某个点,搜一遍它的子树,就能得到这个点的答案.这一步是O(n)的. 每个点都这么搞一遍,就是O(n^2)的暴力做法. 但是这个暴力做法有一点不足,子节点的答案没有应用到父节点的计算中,白白浪费时…
题意:有一棵树,对于每个点求子树中离他深度最多的深度是多少, 题解:线段树合并快如闪电,每个节点开一个权值线段树,递归时合并即可,然后维护区间最多的是哪个权值,到x的深度就是到根的深度减去x到根的深度复杂度O(nlogn) //#pragma comment(linker, "/stack:200000000") //#pragma GCC optimize("Ofast,no-stack-protector") //#pragma GCC target("…