2019.03.09 codeforces620E. New Year Tree(线段树+状态压缩)
传送门
题意:给一棵带颜色的树,可以给子树染色或者问子树里有几种不同的颜色,颜色值不超过606060。
思路:颜色值很小,因此状压一个区间里的颜色用线段树取并集即可。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
typedef long long ll;
const int N=4e5+5;
vector<int>e[N];
int n,m,tot=0,in[N],out[N],pred[N],col[N];
ll bin[N];
void dfs(int p,int fa){
pred[in[p]=++tot]=p;
for(ri i=0,v;i<e[p].size();++i)if((v=e[p][i])^fa)dfs(v,p);
out[p]=tot;
}
namespace SGT{
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (l+r>>1)
ll sta[N<<2],cov[N<<2];
inline void pushup(int p){sta[p]=sta[lc]|sta[rc];}
inline void pushnow(int p,ll v){sta[p]=cov[p]=v;}
inline void pushdown(int p){if(cov[p])pushnow(lc,cov[p]),pushnow(rc,cov[p]),cov[p]=0;}
inline void build(int p,int l,int r){
cov[p]=0;
if(l==r){sta[p]=bin[col[pred[l]]];return;}
build(lc,l,mid),build(rc,mid+1,r),pushup(p);
}
inline void update(int p,int l,int r,int ql,int qr,ll v){
if(ql<=l&&r<=qr)return pushnow(p,v);
pushdown(p);
if(qr<=mid)update(lc,l,mid,ql,qr,v);
else if(ql>mid)update(rc,mid+1,r,ql,qr,v);
else update(lc,l,mid,ql,mid,v),update(rc,mid+1,r,mid+1,qr,v);
pushup(p);
}
inline ll query(int p,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return sta[p];
pushdown(p);
if(qr<=mid)return query(lc,l,mid,ql,qr);
if(ql>mid)return query(rc,mid+1,r,ql,qr);
return query(lc,l,mid,ql,mid)|query(rc,mid+1,r,mid+1,qr);
}
#undef lc
#undef rc
#undef mid
}
inline ll lowbit(const ll&x){return x&-x;}
inline int count_bit(ll x){
int ret=0;
while(x)x^=lowbit(x),++ret;
return ret;
}
int main(){
bin[0]=1;
for(ri i=1;i<=60;++i)bin[i]=bin[i-1]<<1;
n=read(),m=read();
for(ri i=1;i<=n;++i)col[i]=read();
for(ri i=1,u,v;i<n;++i)u=read(),v=read(),e[u].push_back(v),e[v].push_back(u);
dfs(1,0),SGT::build(1,1,n);
for(ri op,v;m;--m){
op=read();
switch(op){
case 1:v=read(),SGT::update(1,1,n,in[v],out[v],bin[read()]);break;
case 2:v=read(),cout<<count_bit(SGT::query(1,1,n,in[v],out[v]))<<'\n';break;
}
}
return 0;
}
2019.03.09 codeforces620E. New Year Tree(线段树+状态压缩)的更多相关文章
- 2019.03.09 codeforces833B. The Bakery(线段树优化dp)
传送门 线段树优化dpdpdp入门题. 要求把nnn个数分成kkk段,每段价值为里面不相同的数的个数,求所有段的价值之和最大值.n≤35000,k≤50n\le35000,k\le50n≤35000, ...
- CodeForces 620E"New Year Tree"(DFS序+线段树+状态压缩)
传送门 •题意 给你一颗 n 个节点的树,每个节点被染上了颜色: 有 m 次操作,每次操作的类型有两种 1 v c : 将以 v 为根的子树的结点全部涂成 c 2 v : 询问以 v 为根的子树的结点 ...
- CF620E New Year Tree(树形+dfs序+线段树+状态压缩)
题目链接 题目大意 \(~~\)给出一棵 nn 个节点的树,根节点为 11.每个节点上有一种颜色 c\(_{i}\) 和m 次操作.操作有两种: \(~~~~\) 1. 1\(~\)u\(~\)c:将 ...
- POJ P2777 Count Color——线段树状态压缩
Description Chosen Problem Solving and Program design as an optional course, you are required to sol ...
- Luogu P1558 色板游戏【线段树/状态压缩】By cellur925
题目传送门 今天非常想再看一遍霸王别姬想不进去题于是开始刷数据结构 注意到至多只有\(30\)种颜色,啊啊啊啊我一开始竟然想的不是状态压缩而是在线段树中存一个30大小的数组,这样每次更新的时候暴力循环 ...
- HDU 6183 Color it cdq分治 + 线段树 + 状态压缩
Color it Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Pro ...
- 2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串)
2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串) https://www.luogu.com.cn/problem/P2824 题意: 在 20 ...
- 2019.03.09 bzoj4999: This Problem Is Too Simple!(树链剖分+线段树动态开点)
传送门 题意:给一颗树,每个节点有个初始值,要求支持将i节点的值改为x或询问i节点到j节点的路径上有多少个值为x的节点. 思路: 考虑对每种颜色动态开点,然后用树剖+线段树维护就完了. 代码: #in ...
- 2019.03.09 bzoj4491: 我也不知道题目名字是什么(线段树)
传送门 题意:给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串. 思路: 注意要求的是子串而不是子序列!!! 然后直接用线段树维护最大子段和的方式合并一 ...
随机推荐
- 在Ubuntu上升级SQLite,并让Python使用新版SQLite
(本文适用于Debian系的Linux,如Ubuntu.Raspbian等等.) 在Linux上,Python的sqlite3模块使用系统自带的SQLite引擎,然而系统自带的SQLite可能版本太老 ...
- Post提交带参网址
前端 $(function(){ var obj=$('#form1'); obj.validate({ submitHandler: function (form){ var data={}; da ...
- repo
repo init -b remoteBranchName repo sync repo start localBranchName --all 整体切分支 if error is tagger cl ...
- 面试必备:ArrayList源码解析(JDK8)
面试必备:ArrayList源码解析(JDK8) https://blog.csdn.net/zxt0601/article/details/77281231 概述很久没有写博客了,准确的说17年以来 ...
- STM32F401 外部中断误触发问题
现象:调试STM32F411低功耗的时候,使用的PA1做个唤醒源,发现在没有触发EXTI的时候,MCU居然被唤醒. 原因:PA1配置成EXTI(上拉输入),经常被误触发 解决方式:将PA1配置成浮空输 ...
- JS实现简单斗地主效果
let play = document.querySelectorAll(".play"); let dizhupai = document.getElementById(&quo ...
- Django系列之web应用与http协议
第一节:最简单的web应用程序 web应用程序指供浏览器访问的程序,通常也简称为web应用.应用程序有两种模式C/S,B/S.C/S是客户端/服务器程序.也就是说这类程序一般独立运行.而B/S就是浏览 ...
- Commit can not be set while enrolled in a transaction
[java] Exception: java.sql.SQLException [java] Message: Commit can not be set while enrolled in a tr ...
- python基础与docker
创建虚拟环境python3 -m venv venv (说明:python 2.X 并不支持) 激活虚拟环境macOS/Linux: source venv/bin/activateWindows: ...
- 自定义Log 写到文件中
using System; using System.Collections.Generic; using System.Web; using System.IO; using System.Text ...