[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为根的子树中的节 ...
随机推荐
- spring的事务处理
说到事务,无非就是事务的提交commit和回滚rollback. 事务是一个操作序列,这些操作要么全部都执行成功,事务去提交,要么就是有一个操作失败,事务去回滚. 要知道事务的4大特性ACID.即原子 ...
- 处理laravel表单提交默认将空值转为null的问题
比如表单提交,如果我们提交了这个字段,但是这个字段为空字符串.在Laravel中会自动转义成Null. 处理这个问题,直到找到中间件\vendor\laravel\framework\src\Illu ...
- 讯为iTop4412嵌入式开发板学习之-------前言
一.linux 工作的分类以及培养时间 Linux 作为一个庞大的体系,有很多相关的研究领域,总结起来大致有五个方向: 1.服务器维护:需要了解 Linux 服务,熟练使用 Shell,了解网络配置. ...
- 基于STM32F103的Max30100心率、血氧检测代码(转载)
MAX30100是能够读取心率.血氧的传感器,通信方式是通过IIC进行通信.其工作原理是通过红外led灯照射,能够得到心率的ADC值. MAX30100的寄存器可以分为五类,状态寄存器.F ...
- python2.7入门---异常处理
python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.我们可以使用该功能来调试python程序. 异常处理. 断言(Assertions). 首先来看py ...
- 修改mysql root密码的方法
方法1: 用SET PASSWORD命令 首先登录MySQL. 格式:mysql> set password for 用户名@localhost = password('新密码'); 例子:my ...
- C#中利用iTextSharp开发二维码防伪标签(1)
开发的基本说明与尝试 一个亲戚朋友是做防伪码印刷的,之前的电话防伪.短信防伪都用Delphi给他设计,使用也挺不错,后来又加了一个基于asp的网页版防伪查询.由于业务需求,今年年初朋友又提成希望能够完 ...
- 12 TCP服务器 进程 线程 非阻塞
1.单进程服务器 from socket import * serSocket = socket(AF_INET, SOCK_STREAM) # 重复使用绑定的信息 serSocket.setsock ...
- mysql 函数以及操作总结
1. 拼接 concat(参数1,参数2,.. ,参数) 实现将多个字符串拼接到一起 要批量修改一个字段值 字段值又是复杂的sql 计算得来 通过查询字段值 和 修改的条件fundId(这是 ...
- jmeter无法启动的解决办法
jmeter下载地址: 链接: https://pan.baidu.com/s/15YhiPH-kNVxISEZ4Mxf_WA 提取码: 25sv jdk 8.0 下载地址: 链接: http ...