[CF620E]New Year Tree
题目大意:有一棵以$1$为根的有根树,有$n$个点,每个节点初始有颜色$c_i$。有两种操作:
$1 v c:$将以$v$为根的子树中所有点颜色更改为$c$
$2 v:$ 查询以$v$为根的子树中的节点有多少种不同的颜色
题解:只有$60$种颜色,可以考虑用一个$long\;long$把颜色状压,用$dfs$序把树上问题转化为线段问题就行了
卡点:各种该开$long\;long$开$int$
C++ Code:
#include <cstdio>
#define maxn 400010
using namespace std;
int head[maxn], cnt;
struct Edge {
int to, nxt;
} e[maxn << 1];
void add(int a, int b) {
e[++cnt] = (Edge) {b, head[a]}; head[a] = cnt;
}
int n, m, a;
long long w[maxn], W[maxn];
long long V[maxn << 2], cov[maxn << 2];
int dfn[maxn], dfn_o[maxn], idx;
void dfs(int rt) {
dfn[rt] = ++idx;
for (int i = head[rt]; i; i = e[i].nxt) {
int v = e[i].to;
if (!dfn[v]) {
dfs(v);
}
}
dfn_o[rt] = idx;
}
void build(int rt, int l, int r) {
cov[rt] = -1;
if (l == r) {
V[rt] = w[l];
return ;
}
int mid = l + r >> 1;
build(rt << 1, l, mid);
build(rt << 1 | 1, mid + 1, r);
V[rt] = V[rt << 1] | V[rt << 1 | 1];
}
void pushdown(int rt) {
long long &tmp = cov[rt];
int lc = rt << 1, rc = rt << 1 | 1;
cov[rc] = cov[lc] = V[rc] = V[lc] = tmp;
tmp = -1;
}
void add(int rt, int l, int r, int L, int R, long long num) {
if (L <= l && R >= r) {
V[rt] = num;
cov[rt] = num;
return ;
}
if (~cov[rt]) pushdown(rt);
int mid = l + r >> 1;
if (L <= mid) add(rt << 1, l, mid, L, R, num);
if (R > mid) add(rt << 1 | 1, mid + 1, r, L, R, num);
V[rt] = V[rt << 1] | V[rt << 1 | 1];
}
long long ask(int rt, int l, int r, int L, int R) {
if (L <= l && R >= r) {
return V[rt];
}
if (~cov[rt]) pushdown(rt);
int mid = l + r >> 1;
long long ans = 0;
if (L <= mid) ans = ask(rt << 1, l, mid, L, R);
if (R > mid) ans = ans | ask(rt << 1 | 1, mid + 1, r, L, R);
return ans;
}
int count(long long num) {
int ans = 0;
while (num) {
ans += num & 1;
num >>= 1;
}
return ans;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &a);
W[i] = 1ll << a - 1;
}
for (int i = 1; i < n; i++) {
int a, b;
scanf("%d%d", &a, &b);
add(a, b);
add(b, a);
}
dfs(1);
for (int i = 1; i <= n; i++) w[dfn[i]] = W[i];
build(1, 1, n);
while (m --> 0) {
int op, x, y;
scanf("%d%d", &op, &x);
if (op --> 1) {
long long tmp = ask(1, 1, n, dfn[x], dfn_o[x]);
printf("%d\n", count(tmp));
} else {
scanf("%d\n", &y);
add(1, 1, n, dfn[x], dfn_o[x], 1ll << y - 1);
}
}
return 0;
}
[CF620E]New Year Tree的更多相关文章
- CF620E New Year Tree(线段树+二进制)
题解 弱智题,二进制表示位数.合并时用| 就是被1<<x卡了好久. 要写成1ll<<x才行 #include<iostream> #include<cstri ...
- CF620E New Year Tree 线段树 dfs序
luogu链接 题目大意: 有一个节点有颜色的树 操作1.修改子树的颜色 操作2.查询子树颜色的种类 注意,颜色种类小于60种 只有子树的操作,dfs序当然是最好的选择 dfs序列是什么,懒得讲了,自 ...
- CF620E New Year Tree 状压+线段树(+dfs序?)
借用学长的活:60种颜色是突破口(我咋不知道QAQ) 好像这几道都是线段树+dfs序??于是你可以把60种颜色压进一个long long 里,然后向上合并的时候与一下(太妙了~) 所以记得开long ...
- CF620E New Year Tree 线段树+dfs序+bitset
线段树维护 dfs 序是显然的. 暴力建 60 个线段树太慢,于是用 bitset 优化就好了 ~ code: #include <bits/stdc++.h> #define M 63 ...
- CF620E New Year Tree(树形+dfs序+线段树+状态压缩)
题目链接 题目大意 \(~~\)给出一棵 nn 个节点的树,根节点为 11.每个节点上有一种颜色 c\(_{i}\) 和m 次操作.操作有两种: \(~~~~\) 1. 1\(~\)u\(~\)c:将 ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- Noip 训练指南
目录 Noip 训练指南 图论 数据结构 位运算 期望 题解 Noip 训练指南 目前完成 \(4 / 72\) 图论 [ ] 跳楼机 [ ] 墨墨的等式 [ ] 最优贸易 [ ] 泥泞的道路 [ ] ...
- 线段树+Dfs序【CF620E】New Year Tree
Description 你有一棵以1为根的有根树,有n个点,每个节点初始有一个颜色c[i]. 有两种操作: 1 v c 将以v为根的子树中所有点颜色更改为c 2 v 查询以v为根的子树中的节点有多少种 ...
- 【CF620E】New Year Tree
(题面来自luogu) 题意翻译 你有一棵以1为根的有根树,有n个点,每个节点初始有一个颜色c[i]. 有两种操作: 1 v c 将以v为根的子树中所有点颜色更改为c 2 v 查询以v为根的子树中的节 ...
随机推荐
- IDEA开发vue.js卡死问题
在执行cnpm install后会在node_modules这个文件下面生成vue的相关依赖文件, 这个时候当执行cnpm run dev命令时,会导致IDEA出现卡死的问题,解决方法如下:
- PHP基础 (麦子学院 第二阶段)
zendstudio 10.0破解版,新建完项目后,首先修改项目的编码方式,统一改成utf-8 (选中项目,再右键properties:Text file encoding).修改字体大小. apac ...
- Make命令完全详解教程
Make命令完全详解教程 无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用m ...
- 【UE4】二十六、Look at camera 蓝图
如图,把BP_Cube替换为你需要的对象(如3DUI等)即可.
- jmeter插件之jsonpath提取响应结果和做断言
准备工作: 1. jmeter3.X已经自带了提取响应结果的插件:JSON Extractor 2. 下载断言插件:https://jmeter-plugins.org/wiki/JSONPathAs ...
- Qt 隐藏标题栏可移动升级版
在最出的时候,在Qt程序隐藏标题栏的情况下,实现界面可拖拽移动,是鼠标在在程序界面的任意位置都可以,现在这个版本是需要鼠标在程序界面的特定位置开可以 上代码 static QPoint last(0, ...
- nmon Analyser分析仪
nmon Analyser官网: https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/Power+System ...
- python------- IO 模型
IO模型介绍 ...
- python 网络篇(计算机网络基础)
计算机网络的发展及基础网络概念 广播 主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无 ...
- Node.js的require()的工作原理
大多数人都知道Node.js中require()函数做什么的,但是有多少人知道它的工作原理呢?我们每天使用它加载库包和模块,但是它的内部行为原理很神秘. 我们追寻Node模块系统的核心: module ...