题解 CF1172E Nauuo and ODT】的更多相关文章

题目传送门 题目大意 给出一个 \(n\) 个点的树,每个点有颜色,定义 \(\text{dis}(u,v)\) 为两个点之间不同颜色个数,有 \(m\) 次修改,每次将某个点的颜色进行更改,在每次操作后求出: \[\sum_{i=1}^{n}\sum_{j=1}^{n}\text{dis}(i,j) \] \(n,m\le 4\times 10^5\) 思路 好妙的一道题啊!!!看 \(\text{yyb}\) 神仙的博客看到的,花了我一个晚上...而且还是看题解看懂的... 首先我们可以想到…
CF1172E Nauuo and ODT 神仙题orz 要算所有路径的不同颜色之和,多次修改,每次修改后询问. 对每种颜色\(c\)计算多少条路径包含了这个颜色,不好算所以算多少条路径不包含这个颜色.颜色是\(c\)的标黑,否则标白,要算的就是黑连通块的\(\sum siz^2\) 对每种颜色用LCT维护连通块.拿出有关的所有操作,动态维护所有连通块的\(\sum siz^2\). (这里有一个trick,黑点向父亲连边,连通块就是连通块去掉根.) 要维护的东西有实子树大小.虚子树大小和虚子树…
分析 lxl大毒瘤. 感谢Ouuan等CNOIER提供了这么好的比赛. 这里只是把官方题解复述一遍,可以直接去看官方题解:点我. 考虑将问题转化为对于每个颜色,求出没有经过这个颜色的节点的路径有多少条,这问题的答案是: \[\sum_{i=1}^{n}(n^2-\sum_{G'}siz_{G'}^2)\] 其中\(G'\)是所有不包含颜色为\(i\)的节点的极大连通块. 视颜色为\(i\)的节点为白点,其余为黑点,那么我们现在要做的就是维护一个数据结构,支持: 修改一个节点的颜色. 询问所有黑点…
首先可以转化问题,变为对每种颜色分别考虑不含该颜色的简单路径条数.然后把不是当前颜色的点视为白色,是当前颜色的点视为黑色,显然路径数量是每个白色连通块大小的平方和,然后题目变为:黑白两色的树,单点翻转颜色,维护白色连通块大小平方和,然后根据Auuan大佬的题解,我用了LCT.就是对每个点维护子树.儿子大小平方和,在 link/cut 的时候更新答案.初始化所有点是白色,离线处理每个颜色即可. 这题放在2h比赛上,除了lxl其他人都写不出来(况且lxl还是本题出题人呢) #include<bits…
自己独立想出来的,超级开心 一开始想的是对于每一个点分别算这个点对答案的贡献. 但是呢,我们发现由于每一条路径的贡献是该路径颜色种类数,而每个颜色可能出现多次,所以这样就特别不好算贡献. 那么,还是上面那句话,由于算的是颜色种类,所以我们可以对每一个颜色种类单独算贡献. 即不以点为单位去算,而是以颜色种类为单位去算. 假设要算颜色为 $r$ 的贡献,那么必须保证每一个路径至少有一个端点在颜色 $r$ 构成的连通块中. 这句话等同于不能出现两个端点都在非 $r$ 连通块的路径,即 $n^2-\su…
[CF1172E]Nauuo and ODT(Link-Cut Tree) 题面 CF 给你一棵树,每个节点有一个颜色. 定义一条路径的权值为路径上不同颜色的数量.求所有有向路径的权值和. 有\(m\)次单点颜色修改操作,每次修改之后输出答案. 题解 如果只有黑白两色,我们要求白色的贡献,那么我们可以把所有白色节点删去,那么答案就是每个黑色连通块的\(size\)平方和.考虑怎么动态维护这个东西. 要做的是,一开始我们的所有节点都是黑点,然后有若干次颜色取反操作,每次求黑色连通块的\(size^…
题解 看了一遍题解(以及代码)但是没写代码-- 后来做梦的时候忽然梦到了这道题--意识到我需要补一下-- 这道题就是,对于每种颜色,把没有染成这种颜色的点标成黑点,然后计算每个联通块的平方 然后每个点维护,虚儿子黑点的siz,虚儿子的siz的平方,还有splay上的siz和 为了保证最高点是白点,我们新建一个点建到根上面 然后把一个点染黑就相当于断掉所有儿子,然后减去所有虚儿子siz的平方,然后顺着fa找到最高的白点,删掉这个白点原先右边挂着的树,然后再减去这个白点原先右边挂着的部分,这个点再连…
Description 给出一棵n个节点的树,每个点有一个1~n的颜色 有m次操作,每次操作修改一个点的颜色 需要在每次操作后回答树上\(n^2\)条路径每条路径经过的颜色种类数和. \(n,m<=400000\) Solution 挺有意思的一个套路 首先我们单独计算每种颜色的贡献,对于每种颜色的点集分开考虑,我们需要计算至少经过了其中一个点的路径条数. 正难则反,考虑计算一个点都没经过的路径条数,那就是将点集删去后剩余连通块的大小平方和. 考虑这样一个模型 对于原本每种颜色有一个黑白两色的树…
Codeforces ZROI那题是这题删掉修改的弱化版--ZROI还我培训费/px 思路 按照套路,我们考虑每种颜色的贡献,然后发现不包含某种颜色的路径条数更容易数,就是删掉该颜色的点后每个连通块大小的平方和. 由于每种颜色影响到的点之和是\(O(n)\)的,所以我们每种颜色分开考虑,就变成了只有两种颜色的情况. 把这种颜色视为白色,其他颜色视为黑色,那么每个黑色点往父亲连边(1往一个虚拟点连边),就可以在白点处统计贡献. 所以每次改变颜色就只是一个link或cut,用LCT维护. 代码 #i…
题目:http://codeforces.com/contest/1172/problem/E LCT好题. 考虑对每个颜色求出 “不是该颜色的点组成的连通块的 siz2 之和” .每个颜色用 LCT 维护不是该颜色的点. LCT 维护的一个连通块,其最顶端的点是该颜色,其他部分满足 “不是该颜色” :再维护子树的 siz2 ,就能做了. 注意代码里的 p[ ] 要开 2*n 那么大!!! #include<cstdio> #include<cstring> #include<…