loj2001[SDOI2017]树点染色】的更多相关文章

题意:给你一棵树,一开始每个点上的颜色互不相同.三种操作:op1:x到根的路径上的点都染上一种新的颜色.op2:设一条路径的权值为val(x,y),求x到y路径的val.op3:询问x的子树中最大的到根路径val.n<=1e5. 标程: #include<bits/stdc++.h> using namespace std; typedef long long ll; ; ; int f[N],prime[N],tot,F[N],ans,p[N],n,m,nxt,u[N],fi[N];…
\[SDOI2017 树点染色\] 题目描述 Bob 有一棵 $ n $ 个点的有根树,其中 $ 1 $ 号点是根节点.Bob 在每个节点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是,这条路径上的点(包括起点和终点)共有多少种不同的颜色. Bob 可能会进行这几种操作: $ 1  x $,把点 $ x $ 到根节点的路径上的所有的点染上一种没有用过的新颜色: $ 2  x  y $,求 $ x $ 到 $ y $ 的路径的权值: $ 3  x $,在以 $ x $ 为根的子树中选择…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4817 https://loj.ac/problem/2001 题解 可以发现这个题就是 bzoj3779 重组病毒 的弱化版. 可以这样考虑.对于每一次染色操作,都是把 \(x\) 点到根的路径上的点全部染成一种颜色. 我们考虑用一个东西来记录下来同色的点,可以发现这个操作和 LCT 的 access 操作很像.如果用 LCT 来维护的话,那么就是一个 splay 记录一堆同色的点. 然后…
传送门 注意到每一次\(1\ x\)操作相当于一次LCT中的access操作.由LCT复杂度证明可以知道access的总次数不会超过\(O(nlogn)\),我们只需要模拟这个access的过程并在其中动态统计每一个点的答案. 我们考虑在虚实边切换的过程中即时更新答案.设当前即将把\(y \rightarrow x\)的虚边转换为实边,设此时\(x\)的实儿子为\(p\).那么对于\(p\)及其子树,所有点到根的路径经过的颜色数量均\(+1\):对于\(y\)及其所有点的子树,它们经过的颜色的数…
题目链接 发现1操作很像lct中的access,然后它每次染的又是一个新颜色,因此同一个颜色就在同一颗splay里了,且一个点到根的权值val[i]也就是到根路径上虚边的个数,然后看access时会对哪些点的val[i]产生影响. 以下的原儿子表示原来与x在同一颗splay中的儿子 (注意不是splay中x的儿子,是原树中x的儿子,即splay中x的后继). 当x断开与它原儿子所在splay的连接时,原儿子的子树val都要+1,接上的新儿子的splay,新儿子所在子树val要-1. 对于2操作,…
题目分析: 操作一很明显等价于LCT上的access操作,操作二是常识,操作三转化到dfs序上求最大值也是常识.access的时候顺便在线段树中把对应部分-1,把右子树的子树+1即可. 代码: #include<bits/stdc++.h> using namespace std; ; int num,n,m; vector <int> g[maxn]; int f[maxn],dep[maxn],dfsin[maxn],dfsout[maxn]; class SegmentTre…
 [题解]: #include<cstdio> #include<cstring> #include<iostream> using namespace std; ; ];int tot,head[N],cur[N]; ]; inline int read(){ ,f=;char ch=getchar(); ;ch=getchar();} +ch-';ch=getchar();} return x*f; } void add(int x,int y){ e[++tot]…
题目大意 有一棵\(n\)(\(n\leq10^5\))个节点的树,每个点有颜色\(c\),一开始所有颜色互不相同 要进行\(m\)(\(m\leq10^5\))次操作,每次操作是以下三种中的一种: 1.给出点\(x\),将点\(x\)到根路径上所有点的染成一种没出现过的颜色 2.给出点\(x\),\(y\),询问点\(x\)到\(y\)的简单路径上有多少种颜色 3.给出点\(x\),询问点\(x\)的子树中到根路径上颜色种类最多的点 题解 把1操作看成LCT的access操作,2操作就相当于询…
[Sdoi2017]树点涂色 题意:一棵有根树,支持x到根染成新颜色,求x到y颜色数,求x子树里点到根颜色数最大值 考场发现这个信息是可减的,但是没想到lct 特意设计成lct的形式! 如何求颜色数? 维护一个点和父亲的颜色是否一样,不一样为1,就是前缀和.考虑相邻的思想和那道"水位线"有点像 x到y的答案就是\(S_x + S_y - 2*S_{lca} + 1\) 一个点到根染新颜色,对应了lct的access操作,重边就是一样轻边就是不一样,修改轻重边就是子树加,其他两个操作单点…
P3703 [SDOI2017]树点涂色 链接 分析: 首先对于询问,感觉是线段树维护dfs序,每个点记录到根的颜色个数.第二问差分,第三问区间取max. 那么考虑修改,每次将一个点的颜色变成和父节点的颜色一样的过程中,这个点的子树内都会-1. 这个修改的过程我们可以认为是修改边的过程,将一些边设为1,一些边设为0,那么一次修改对于一个点就是将原来1的边设为0,现在的边设为1. 1和0类似lct中实边与虚边,所以可以lct维护当前那些边是1,那些是0. 感觉跟个暴力似的,但是lct中access…