CF620E New Year Tree

题意:给出一棵 n 个节点的树,根节点为 1。每个节点上有一种颜色 ci​。m 次操作。操作有两种:

  • 1 u c:将以 u 为根的子树上的所有节点的颜色改为 c。
  • 2 u:询问以 u 为根的子树上的所有节点的颜色数量。

    1 <= c <= 60。

由于 c 的范围,可以用一个整数来表示每棵子树的状态。

将树上问题转化为序列问题,当然可以树剖,但本题只对子树操作,维护 in 为进树时的时间戳,out 为出树时的时间戳,再在 dfs 序上用线段树维护即可。

CF1916E 很像。

#include<bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i <= (b); ++ i)
#define per(i, a, b) for(int i = (a); i >= (b); -- i)
#define pb emplace_back
#define All(X) X.begin(), X.end()
#define ls x << 1
#define rs ls | 1
using namespace std;
using ll = long long;
constexpr int N = 4e5 + 5; int n, m, c[N], in[N], out[N], timestamp;
vector<int> G[N]; struct Node {
ll v, tag;
} t[N << 2]; void pushup(int x) {
t[x].v = t[ls].v | t[rs].v;
} void pushdown(int x) {
if(t[x].tag) {
t[ls].v = t[ls].tag = t[x].tag;
t[rs].v = t[rs].tag = t[x].tag;
t[x].tag = 0;
}
} void modify(int L, int R, int v, int x = 1, int l = 1, int r = n) {
if(L <= l && r <= R) {
t[x].v = t[x].tag = 1ll << v;
return;
}
pushdown(x);
int mid = l + r >> 1;
if(mid >= L) modify(L, R, v, ls, l, mid);
if(mid < R) modify(L, R, v, rs, mid + 1, r);
pushup(x);
} ll query(int L, int R, int x = 1, int l = 1, int r = n) {
if(L <= l && r <= R) return t[x].v;
pushdown(x);
int mid = l + r >> 1;
ll ret = 0;
if(mid >= L) ret |= query(L, R, ls, l, mid);
if(mid < R) ret |= query(L, R, rs, mid + 1, r);
return ret;
} void dfs(int x, int fa) {
in[x] = ++ timestamp;
modify(in[x], in[x], c[x]);
for(int y : G[x]) {
if(y != fa) {
dfs(y, x);
}
}
out[x] = timestamp;
} int main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
cin >> n >> m;
rep(i, 1, n) cin >> c[i];
rep(i, 2, n) {
int x, y; cin >> x >> y;
G[x].pb(y);
G[y].pb(x);
}
dfs(1, 0);
rep(i, 1, m) {
int op, x; cin >> op >> x;
if(op == 1) {
int col; cin >> col;
modify(in[x], out[x], col);
}
else cout << __popcount(query(in[x], out[x])) << '\n';
}
return 0;
}

CF620E New Year Tree (线段树维护 dfs 序)的更多相关文章

  1. CF877E Danil and a Part-time Job 线段树维护dfs序

    \(\color{#0066ff}{题目描述}\) 有一棵 n 个点的树,根结点为 1 号点,每个点的权值都是 1 或 0 共有 m 次操作,操作分为两种 get 询问一个点 x 的子树里有多少个 1 ...

  2. CodeForces 343D 线段树维护dfs序

    给定一棵树,初始时树为空 操作1,往某个结点注水,那么该结点的子树都注满了水 操作2,将某个结点的水放空,那么该结点的父亲的水也就放空了 操作3,询问某个点是否有水 我们将树进行dfs, 生成in[u ...

  3. P3703 [SDOI2017]树点涂色 LCT维护颜色+线段树维护dfs序+倍增LCA

    \(\color{#0066ff}{ 题目描述 }\) Bob有一棵\(n\)个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点 ...

  4. 【HIHOCODER 1576】 子树中的最小权值(线段树维护DFS序)

    描述 给定一棵N个节点的树,编号1~N.其中1号节点是根,并且第i个节点的权值是Vi. 针对这棵树,小Hi会询问小Ho一系列问题.每次小Hi会指定一个节点x,询问小Ho以x为根的子树中,最小的权值是多 ...

  5. bzoj 3779: 重组病毒【LCT+线段树维护dfs序】

    %.8lf会WA!!%.8lf会WA!!%.8lf会WA!!要%.10lf!! 和4817有点像,但是更复杂. 首先对于操作一"在编号为x的计算机中植入病毒的一个新变种,在植入一个新变种时, ...

  6. BZOJ 4817 [SDOI2017]树点涂色 (LCT+线段树维护dfs序)

    题目大意:略 涂色方式明显符合$LCT$里$access$操作的性质,相同颜色的节点在一条深度递增的链上 用$LCT$维护一个树上集合就好 因为它维护了树上集合,所以它别的啥都干不了了 发现树是静态的 ...

  7. CF620E New Year Tree 线段树+dfs序+bitset

    线段树维护 dfs 序是显然的. 暴力建 60 个线段树太慢,于是用 bitset 优化就好了 ~ code: #include <bits/stdc++.h> #define M 63 ...

  8. CF620E New Year Tree 线段树 dfs序

    luogu链接 题目大意: 有一个节点有颜色的树 操作1.修改子树的颜色 操作2.查询子树颜色的种类 注意,颜色种类小于60种 只有子树的操作,dfs序当然是最好的选择 dfs序列是什么,懒得讲了,自 ...

  9. CF620E New Year Tree 状压+线段树(+dfs序?)

    借用学长的活:60种颜色是突破口(我咋不知道QAQ) 好像这几道都是线段树+dfs序??于是你可以把60种颜色压进一个long long 里,然后向上合并的时候与一下(太妙了~) 所以记得开long ...

  10. 2018.11.01 NOIP训练 图论(线段树+倍增+dfs序)

    传送门 一道挺妙的题. 对于询问点(u,v),如右图所示,我们可以发现存在一个点m在u->v的路径中,m子树的点到u是最近的,m子树外到v是最近的.其中dis(u,m)=(dis(u,v)-1) ...

随机推荐

  1. 在使用若依分离版时遇到富文本不显示html解决

    <el-table-column label="公告内容" align="center" prop="content"> < ...

  2. KingbaseES 数据库使用Limit子句查询结果返回顺序不一致

    一.KingbaseES数据库limit查询子句: 在KingbaseES数据库使用LIMIT子句限制查询结果的行数,从而实现分段显示数据的功能. 使用LIMIT子句在KingbaseES数据库中进行 ...

  3. java实战字符串+栈5:解码字符

    题目: 有形如 (重复字符串)<重复次数n> 的片段,解码后相当于n个重复字符串连续拼接在一起,求展开后的字符串.  求解: public static String zipString( ...

  4. debian12安装arch到chroot环境

    纯属瞎玩,可能有风险 1.安装工具 sudo apt install pacman-package-manager arch-install-scripts archlinux-keyring 2.创 ...

  5. layui框架使用单页面弹出层组件layer

    layui实现单页面弹出层 首先需要导入layui的js和css: <link rel="stylesheet" href="layui/css/layui.css ...

  6. ASCII编码的全面介绍

    1. ASCII编码的定义和历史 ASCII(American Standard Code for Information Interchange)是一种用于将文本字符转换为数字编码的标准,最初由美国 ...

  7. 鸿蒙HarmonyOS实战-ArkUI组件(Radio)

    一.Radio Radio单选框是一种表单元素,允许用户从一组选项中选择一个选项.它由一个圆圈和一个标签组成,用户只能选择其中一个选项.Radio单选框通常用于表单中,用于收集用户选择的信息,例如用户 ...

  8. 3 JavaScript字符串操作

    3 字符串操作 常用的字符串操作相关的方法: s.split() 字符串切割 s.substr(start, len) 字符串切割, 从start开始切, 切len个字符 s.substring(st ...

  9. OpenHarmony技术日探讨教育发展,聚焦开源人才培养

    4 月 25 日,OpenAtom OpenHarmony (以下简称"OpenHarmony")技术日在深圳成功举办.作为 OpenHarmony 开源项目的年度盛会,大会以&q ...

  10. Tailscale 的 TLS 证书过期,网站挂了 90 分钟!

    3月7日,基于 WireGuard 的知名 VPN 厂商 Tailscale 的官方网站 tailscale.com 因 TLS 证书过期而中断服务约90分钟. 虽然影响有限,但这起事件还是在 Hac ...