传送门

题意:给一棵带颜色的树,可以给子树染色或者问子树里有几种不同的颜色,颜色值不超过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;
}

最新文章

  1. 关于MySql的1045错误修正
  2. 为什么是梯度下降?SGD
  3. [2]R语言在数据处理上的禀赋之——可视化技术
  4. spark中操作hdfs
  5. JQuery Mobile页面加载处理
  6. java_jdbc_batch处理_主键id获取
  7. listview 遇到问题java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
  8. box-shadow属性
  9. ubuntu经常使用的命令摘要
  10. jQuery特殊符号转义
  11. Kudu-压缩
  12. ASP.NET Global.asax详解【转】
  13. MySQL优化之——安全地关闭MySQL实例
  14. Java 内存模型基础
  15. eclipse Java注释修改
  16. angularJS----filter
  17. Magazine Ad CodeForces - 803D(二分 + 贪心,第一次写博客)
  18. SSD(Single Shot MultiBox Detector)二读paper
  19. javascript实现数据结构: 串的块链存储表示
  20. Pycharm安装类库

热门文章

  1. 用word发CSDN blog,免去插图片的烦恼
  2. python 图片识别灰度
  3. 解决easyUI中翻页后前面已钩选项自动变为未选择的问题
  4. [原创] debian 9.3 搭建Jira+Confluence+Bitbucket项目管理工具(四) -- 安装bitbucket 5.7.0
  5. iframe刷新
  6. Git安装配置和提交本地代码至Github,修改GitHub上显示的项目语言
  7. 红黑树(red-black tree)实现记录
  8. MyCP -tx -xt 功能的Java实现
  9. paloalto防火墙的优势
  10. MVC开发T4代码生成之一----文本模板基础