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. css实现多余文字隐藏,用省略号代替

    .txt{ overflow: hidden; //溢出内容隐藏 white-space: nowrap; //强制文本在一行内显示 text-overflow: ellipsis; //当对象内文本 ...

  2. #对顶堆#nssl 1477 赛

    分析 首先按小到大排序,考虑枚举两个都喜欢的个数\(i\) 那么只喜欢一个的个数各需要\(k-i\),剩下要补充到\(m-k*2+i\)个, 考虑用对顶堆维护大根堆大小仅有\(m-k*2+i\)即可 ...

  3. #树形dp#B 预算缩减

    题目 给定一棵树,你需要删去一些边(可以不删),使得剩下的图中每个点所在的连通块大小都\(\geq k\). 求删边的方案数,对\(786433\)取模.两种方案不同,当且仅当存在一条边在一个方案中被 ...

  4. #构造#洛谷 6470 [COCI2008-2009#6]CUSKIJA

    题目 给定一个长度为 \(n\) 的序列 \(a\),请将其重新排序, 新序列中任意相邻两个数之和都不能被 \(3\) 整除. 分析 分类讨论,如果只有3的倍数多于1个无解 没有 \(3k+1\) 或 ...

  5. JDK 14的新特性:switch表达式

    目录 简介 写在前面 连写case switch返回值 yield 总结 简介 switch的新特性可是源远流长,早在JDK 12就以预览功能被引入了,最终在JDK 14成为了正式版本的功能:JEP ...

  6. 第十四篇:JavaScript基础

    一.CSS内容补充之position 10.position:fixed:固定div在页面的一个位置: top:0; right:0; left:0; position:absolute + rela ...

  7. nginx重新整理——————http请求的11个阶段中的日志阶段[十九]

    前言 简单介绍一下access log 阶段. 正文 日志模块是 ngx_http_log_module,这个模块无法禁用,内置的. 结 上面是日志的用法.主要的一个内容是日志如果是变量的话,那么需要 ...

  8. docker 应用篇————docker安装[二]

    前言 这其实是去年的一篇blog,忘了写了.本来我想先发一下理论的,但是水平.... 正文 如果你不熟悉linux,而是使用windows,那么你可以这样下载windows桌面版或者说你在这之前完全不 ...

  9. 如何将 ASP.NET Core MVC 项目的视图分离到另一个项目

    如何将 ASP.NET Core MVC 项目的视图分离到另一个项目 在当下这个年代 SPA 已是主流,人们早已忘记了 MVC 以及 Razor 的故事.但是在某些场景下 SSR 还是有意想不到效果. ...

  10. vue 弹出框挂载富文本,富文本()无法实例化问题

    因为elementUI的dialog组件,他是v-if渲染,再页面刚加载时,这个弹出框还未进行挂载,我们就让他v-show显示. ,富文本实例再mounted里面挂载即可