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. 算法学习笔记【5】| ST表

    ST表 Part 1:ST表解决的问题是什么 ST 表可以用来解决RMQ(区间最值问题)等可重复贡献的问题. ST表基于倍增的思想来实现. Part 2:ST表的实现 ST表通过 O(nlog⁡n)& ...

  2. Java实现哈希表

    2.哈希表 2.1.哈希冲突 冲突位置,把数据构建为链表结构. 装载因子=哈希表中的元素个数 / (散列表)哈希表的长度 装载因子越大,说明链表越长,性能就越低,那么哈希表就需要扩容,把数据迁移到新的 ...

  3. 【Java面试题】Spring

    八.Spring 57)什么是 Spring 的依赖注入 IOC( Inversion of Control )的⼀个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象. 其中依赖注入(DI ...

  4. Python 列表list方法clear( )和直接list [ ]的区别

    x.clear()是将内存地址清空, x=[ ]会新开辟一个内存空间.

  5. 03-【HAL库】STM32实现SYN6288模块语音播报.md

    一.什么是SYN6288模块 1.概述 ​ SYN6288 中文语音合成芯片是北京宇音天下科技有限公司于2010 年初推出的一款性/价比更高,效果更自然的一款中高端语音合成芯片.SYN6288 通过异 ...

  6. .NET 8使用日志功能以及自定义日志提供程序

    .NET 8使用日志功能以及自定义日志提供程序 日志级别 下表列出了 LogLevel 值.方便的 Log{LogLevel} 扩展方法以及建议的用法: 展开表 LogLevel "值&qu ...

  7. clang的lto特性的资料

    clang对lto的支持,如下文章介绍的清晰.易懂. ThinLTO llvm+clang 添加 LTO(Link Time Optimization) 支持 编译优化之 - 链接时优化(LTO)入门 ...

  8. SQL CREATE INDEX 语句- 提高数据库检索效率的关键步骤

    SQL CREATE INDEX 语句 SQL CREATE INDEX 语句用于在表中创建索引. 索引用于比其他方式更快地从数据库中检索数据.用户无法看到索引,它们只是用于加速搜索/查询. 注意: ...

  9. C# 面试问答

    引用:https://www.cnblogs.com/zh7791/p/13705434.html   1.什么是 COM? COM 代表组件对象模型.COM 是微软技术之一.使用这项技术,我们可以开 ...

  10. 聚焦AI新技术,HMS Core机器学习服务为移动应用智能化注入新动力

    近年来,以机器学习为代表的人工智能技术(以下简称AI技术)蓬勃发展.新算法层出不穷,开发出的图像识别.自然语言.活体检测等能力令智能化的未来生活不再遥不可及.同时,这些AI技术正持续演化和发展,数据和 ...