这个题有一个技巧:把颜色压到一个long long 上。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
typedef long long LL;
LL lft[],c[];
vector<int> e[];
int n,m;
int pp[],lp[],rp[],len;
void dfs(int u,int fa)
{
pp[++len]=u;lp[u]=len;
for(auto& v:e[u])
if(v!=fa)
dfs(v,u);
rp[u]=len;
}
#define mid ((l+r)>>1)
#define lc (num<<1)
#define rc (num<<1|1)
LL dat[],setv[];
void build(int l,int r,int num)
{
setv[num]=-;
if(l==r) {dat[num]=c[pp[l]];return;}
build(l,mid,lc);build(mid+,r,rc);
dat[num]=dat[lc]|dat[rc];
}
int L,R;LL x;
void pd(int l,int r,int num)
{
if(setv[num]!=-)
{
dat[lc]=setv[num];dat[rc]=setv[num];
setv[lc]=setv[num];setv[rc]=setv[num];
setv[num]=-;
}
}
void change(int l,int r,int num)
{
if(L<=l&&r<=R) {dat[num]=x;setv[num]=x;return;}
pd(l,r,num);
if(L<=mid) change(l,mid,lc);
if(mid<R) change(mid+,r,rc);
dat[num]=dat[lc]|dat[rc];
}
LL query(int l,int r,int num)
{
if(L<=l&&r<=R) return dat[num];
pd(l,r,num);
LL ans=;
if(L<=mid) ans|=query(l,mid,lc);
if(mid<R) ans|=query(mid+,r,rc);
return ans;
}
int main()
{
int i,a,b,v,idx;
lft[]=;
for(i=;i<=;i++) lft[i]=lft[i-]<<;
scanf("%d%d",&n,&m);
for(i=;i<=n;i++) scanf("%lld",&c[i]),c[i]=lft[c[i]];
for(i=;i<n;i++)
{
scanf("%d%d",&a,&b);
e[a].push_back(b);e[b].push_back(a);
}
dfs(,);
build(,n,);
while(m--)
{
scanf("%d",&idx);
if(idx==)
{
scanf("%d%lld",&v,&x);x=lft[x];
L=lp[v];R=rp[v];change(,n,);
}
else if(idx==)
{
scanf("%d",&v);L=lp[v];R=rp[v];
printf("%d\n",__builtin_popcountll(query(,n,)));
}
}
return ;
}

New Year Tree CodeForces -620E的更多相关文章

  1. Z - New Year Tree CodeForces - 620E 线段树 区间种类 bitset

    Z - New Year Tree CodeForces - 620E 这个题目还没有写,先想想思路,我觉得这个题目应该可以用bitset, 首先这个肯定是用dfs序把这个树转化成线段树,也就是二叉树 ...

  2. Vasya and a Tree CodeForces - 1076E(线段树+dfs)

    I - Vasya and a Tree CodeForces - 1076E 其实参考完别人的思路,写完程序交上去,还是没理解啥意思..昨晚再仔细想了想.终于弄明白了(有可能不对 题意是有一棵树n个 ...

  3. Distance in Tree CodeForces - 161D

    Distance in Tree CodeForces - 161D 题意:给一棵n个结点的树,任意两点之间的距离为1,现在有点u.v,且u与v的最短距离为k,求这样的点对(u,v)的个数((u,v) ...

  4. Water Tree CodeForces 343D 树链剖分+线段树

    Water Tree CodeForces 343D 树链剖分+线段树 题意 给定一棵n个n-1条边的树,起初所有节点权值为0. 然后m个操作, 1 x:把x为根的子树的点的权值修改为1: 2 x:把 ...

  5. Codeforces 620E New Year Tree(DFS序 + 线段树)

    题目大概说给一棵树,树上结点都有颜色(1到60),进行下面两个操作:把某结点为根的子树染成某一颜色.询问某结点为根的子树有多少种颜色. 子树,显然DFS序,把子树结点映射到连续的区间.而注意到颜色60 ...

  6. CodeForces 620E New Year Tree

    线段树+位运算 首先对树进行DFS,写出DFS序列,记录下每一个节点控制的区间范围.然后就是区间更新和区间查询了. 某段区间的颜色种类可以用位运算来表示,方便计算. 如果仅有第i种颜色,那么就用十进制 ...

  7. CodeForces 620E New Year Tree(线段树的骚操作第二弹)

    The New Year holidays are over, but Resha doesn't want to throw away the New Year tree. He invited h ...

  8. CodeForces 620E:New Year Tree(dfs序+线段树)

    E. New Year Treetime limit per test3 secondsmemory limit per test256 megabytesinputstandard inputout ...

  9. Codeforces 620E New Year Tree(线段树+位运算)

    题目链接 New Year Tree 考虑到$ck <= 60$,那么用位运算统计颜色种数 对于每个点,重新标号并算出他对应的进和出的时间,然后区间更新+查询. 用线段树来维护. #includ ...

随机推荐

  1. &quot;What&#39;s New&quot; WebPart in SharePoint

    "What's New" WebPart in SharePoint 项目描写叙述         这是一个自己定义WebPart,能够显示一个列表,这个列表项目是在SharePo ...

  2. linux中的线程局部存储(TLS)

    http://blog.csdn.net/cywosp/article/details/26469435

  3. 去掉小程序textarea上的完成按钮栏

    小程序textarea上会自动多一个完成按钮,如下图所示,如果是mpVue,在textarea添加     :show-confirm-bar="false"     即可.  

  4. UML视频总结

    "RUP 4+1"视图 学习UML我们就必须先了解这"RUP 4+1"视图,它是架构设计的结构标准,例如以下图所看到的. watermark/2/text/aH ...

  5. TestNg的工厂測试引用@DataProvider数据源----灵活使用工厂測试

    之前说过@Factory更适合于同一类型的參数变化性的測试,那么假设參数值没有特定的规律时,我们能够採用@Factory和@DataProvider相结合的方式进行測试 注意要点:请注意測试方法将被一 ...

  6. 微信企业号调用js-sdk注意事项

    企业号应用必须添加可信域名,域名必须通过备案,可以是子域名,如果网站带端口,一定也要加上端口号...踩坑记

  7. 判断一个包是否可以安装是一个NP-complete问题

    1 checking whether a single package P can be installed, given a repository R,is NP-complete

  8. 【剑指offer】面试题42:单词翻转顺序&左右旋转字符串

    这里尽可能的不去用语言本身提供的函数. 将string逆置 def reverse(string): #return string[::-1] reversedStr = '' for i in xr ...

  9. HDU1114 Piggy-Bank —— DP 完全背包

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1114 Piggy-Bank Time Limit: 2000/1000 MS (Java/ ...

  10. java 类属性、方法加载的顺序

    1.静态变量 2.静态代码块 3.局部代码块 4.构造函数 5.普通代码块 6.静态方法 7.普通方法 8.普通属性