【CF1009F】Dominant Indices】的更多相关文章

[CF1009F]Dominant Indices(长链剖分) 题面 洛谷 CF 翻译: 给定一棵\(n\)个点,以\(1\)号点为根的有根树. 对于每个点,回答在它子树中, 假设距离它为\(d\)的点有\(f_d\)个,求最大的\(f_d\),并且输出\(d\),如果有多个\(f_d\)相同,输出最小的\(d\). 题解 这个东西和深度相关,很显然可以直接用长链剖分维护,时间复杂度\(O(N)\) 这道题目要维护的东西其实也很类似于\(dsu\ on\ tree\),但是复杂度会多个\(log…
题目 长链剖分板子题啊 长链剖分有几个神奇的性质 所有长链的总点数为\(n\) 任意一个点的\(k\)级祖先所在长链的长度肯定不小于\(k\) 从任意点到根经过的短边数量不超过\(\sqrt{n}\),也就是用长链剖分求\(LCA\)是根号复杂度的.. 最后一个性质是这样的,从一个点往上经过一条短边,点数要加\(1\),再经过一条短边,点数要加\(2\),经过一共\(k\)条短边,点数要加\(\frac{k(k+1)}{2}\),于是短边次数就是\(\sqrt{n}\)级别的 之后长链剖分可以\…
题目链接 \(O(n^2)\)的\(DP\)很容易想,\(f[u][i]\)表示在\(u\)的子树中距离\(u\)为\(i\)的点的个数,则\(f[u][i]=\sum f[v][i-1]\) 长链剖分. \(O(1)\)继承重儿子的信息,再暴力合并其他轻儿子的信息,时间复杂度是线性的. 继承重儿子用指针实现,非常巧妙. #include <cstdio> int xjc; char ch; inline int read(){ xjc = 0; ch = getchar(); while(c…
点此看题面 大致题意: 设\(d(x,y)\)表示\(x\)子树内到\(x\)距离为\(y\)的点的个数,对于每个\(x\),求满足\(d(x,y)\)最大的最小的\(y\). 暴力\(DP\) 首先让我们来思考如何暴力\(DP\). 这应该还是比较简单的吧. 直接设\(f_{x,i}\)表示在\(x\)的子树内,到\(x\)的距离为\(i\)的点的个数. 则不难推出转移方程: \[f_{x,0}=1,f_{x,i}=\sum f_{son_x,i-1}\] 但这样显然跑不过,要优化. 长链剖分…
[CF873F]Forbidden Indices 题意:给你一个串s,其中一些位置是危险的.定义一个子串的出现次数为:它的所有出现位置中,不是危险位置的个数.求s的所有子串中,长度*出现次数的最大值. |S|<=200000 题解:板子题啊,沿着pre树统计一下子树权值和,然后用mx*权值和更新答案就好了. #include <cstdio> #include <cstring> #include <iostream> #include <algorith…
要求每个点子树中节点最多的层数,一个通常的思路是树上启发式合并,对于每一个点,保留它的重儿子的贡献,暴力扫轻儿子将他们的贡献合并到重儿子里来. 参考重链剖分,由于一个点向上最多只有$log$条轻边,故每个点最多被合并$log$次.但这不是这题想说的. 由于我们只保留以深度为下标的信息,重链剖分就会多算,以此引出长链剖分,权且作为一个模板来学习. 长链剖分时,每个点以最深的儿子作为长儿子,其余为短儿子. 每个点$O(1)$继承长儿子的信息,将短儿子的信息合并上来.每个点只有作为短儿子时才保留以它为…
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)的暴力做法. 但是这个暴力做法有一点不足,子节点的答案没有应用到父节点的计算中,白白浪费时…
[链接]h在这里写链接 [题意] 让你在n个点组成的集合里面选取不为空的集合s. 使得这里面的点没有出现某个点a和b,ax>=bx且ay>=by; 问你s的个数. [题解] 我们把这些点按照(x,y)升序排(x优先,y次之). 然后按顺序处理这些点. 会发现. 我们在处理(x,y)点的时候. 只有它的左上方那些点是可以和他在一起的. (也即xi<x 且 yi > y) 随便取左上方的矩形区域里面的一个点.都能组成一个集合. 但是随便取的那个点,可能也可以和它的左上方的更小的矩形区域…
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object set(iterable) -> new set object Build an unordered collection of unique elements. """ def add(self, *args, **kwargs): # real signature un…