题目链接【http://codeforces.com/problemset/problem/620/E】

题意:给出n个数,每个数有一个初始的颜色。由这n个数组成一颗树。有两种操作1、将以节点u为根的子树的颜色染成k色。2、输出以节点u为根的子树的颜色总数。颜色有60种。

题解:1、用DFS重新对这棵树编号in[u],out[u]表示以节点u为根的子树的区间左右端点。2、用线段树维护更新与查询。3、颜色保存:se每一个二进制位表示一种颜色。0表示没有这种颜色,反之有。

因为有60种颜色,要用LL保存颜色。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e6+;
vector<int> v[maxn];
int in[maxn],out[maxn];
LL c[maxn];
int n,m;
int id;
void DFS_ORDER(int u)
{
in[u] = ++id;
for(int i = ;i < v[u].size();i++)
{
int w = v[u][i];
if(!in[w]) DFS_ORDER(w);
}
out[u] = id;
}
LL E[maxn*],T[maxn*];//值数组,标记数组
void update(int id,int l,int r,int In,int Out,LL val)
{
if(r < In || l > Out)//不重合
return ;
if(l >= In && Out >= r)//包含
{
E[id] = val;
T[id] = val;
return ;
}
if(T[id])//相交
{
int mid = (l+r)>>;
T[id << ] = T[id];
E[id << ] = T[id];
T[id << | ] = T[id];
E[id << | ] = T[id];
T[id] = ;//取消标记
}
int mid = (l+r) >>;
update(id<<,l,mid,In,Out,val);
update(id<<|,mid+,r,In,Out,val);
E[id] = E[id<<]|E[id<<|];
}
LL query(int id,int l,int r,int In,int Out)
{
if(r < In || l > Out)//不重合
return ;
if(l >= In && Out >= r)//包含
return E[id];
if(T[id])//相交
{
int mid = (l+r)>>;
T[id << ] = T[id];
E[id << ] = T[id];
T[id << | ] = T[id];
E[id << | ] = T[id];
T[id] = ;//取消标记
}
int mid = (l+r) >>;
LL ans1 = query(id<<,l,mid,In,Out);
LL ans2 = query(id<<|,mid+,r,In,Out);
return ans1|ans2;
}
int main ()
{
scanf("%d%d",&n,&m);
for(int i = ;i <= n;i++)
scanf("%lld", &c[i]);
for(int i = ;i <= n-;i++)
{
int u,w;
scanf("%d%d",&u,&w);
v[u].push_back( w );
v[w].push_back( u );
}
DFS_ORDER();
for(int i = ;i <= n;i++)
{
LL x = LL()<<(c[i]-);
update(,,n,in[i],in[i],x);
}
int ty,u;LL val;
for(int i = ;i <= m;i++)
{
scanf("%d",&ty);
if(ty == )
{
scanf("%d%lld",&u,&val);
LL x = LL()<<(val-);
update(,,n,in[u],out[u],x);
}
else
{
scanf("%d",&u);
LL t = query(,,n,in[u],out[u]);
int ans=;
while(t){if(t&)ans++;t>>=;}
printf("%d\n",ans);
}
}
return ;
}

New Year Tree 【DFS序+先段数区间查询修改+二进制保存状态】的更多相关文章

  1. New Year Tree 【DFS序+线段树区间查询修改+二进制保存状态】

    题目链接[http://codeforces.com/problemset/problem/620/E] 题意:给出n个数,每个数有一个初始的颜色.由这n个数组成一颗树.有两种操作1.将以节点u为根的 ...

  2. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  3. 【bzoj3779】重组病毒 LCT+树上倍增+DFS序+树状数组区间修改区间查询

    题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作 ...

  4. [poj3321]Apple Tree(dfs序+树状数组)

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26762   Accepted: 7947 Descr ...

  5. Codeforces Round #225 (Div. 1) C. Propagating tree dfs序+ 树状数组或线段树

    C. Propagating tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/383/p ...

  6. poj 3321 Apple Tree dfs序+线段树

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K       Description There is an apple tree outsid ...

  7. Codeforces Round #225 (Div. 1) C. Propagating tree dfs序+树状数组

    C. Propagating tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/383/p ...

  8. Codeforces Round #200 (Div. 1)D. Water Tree dfs序

    D. Water Tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/343/problem/ ...

  9. POJ3321Apple Tree Dfs序 树状数组

    出自——博客园-zhouzhendong ~去博客园看该题解~ 题目 POJ3321 Apple Tree 题意概括 有一颗01树,以结点1为树根,一开始所有的结点权值都是1,有两种操作: 1.改变其 ...

随机推荐

  1. android:minSdkVersion 之我见

    在 新建一个 android project 时,要求输入 minSdkVersion 这一项,一般我们是指定和我们使用的 SDK 版本相一致的 API Level. 然后,在androidManif ...

  2. 分享一个javascript alert精简框架

    如果你不喜欢浏览器自带的alert你可以尝试总共不超过10KB somke js  下载地址:http://smoke-js.com/ 使用方法 somke.alert("hello wor ...

  3. POJ 2409 Let it Bead 组合数学

    题目地址: http://poj.org/problem?id=2409 给你一串珠子有m个,用n种不同的颜色涂色,问有多少种分法. 用polay定理求解,对于排成一排的带编号的小球,按照某一种方案改 ...

  4. 一口一口吃掉Hexo(二)

    如果你想得到更好的阅读效果,请访问我的个人网站 ,版权所有,未经许可不得转载! 本次系列教程的第二篇文章我会介绍如何在本地安装Hexo,请注意我使用的Windows系统,如果你是Mac或者Ubuntu ...

  5. java 线程池简介

    线程池简介 通过前面的章节我们了解到如何去创建线程,但是如果我们每一次多去创建线程.我们是否回去想,既然是创建线程我们为什么不能像连接池一样呢.做到线程之间的复用呢,减少资源之间的让费呢? jdk为我 ...

  6. Xpath学习笔记

    最近复习自己上一年的课本,想起来刚学那个时候想做一个写日记的软件. 想不如做,用控制台瞎写了一个,一做就成了,没什么bug,期间使用Xpath来读数据,所以就稍微学了一下. 学习过程就这样做一点笔记, ...

  7. C#开发学习——常用的正则表达式

    对于想学习正则表达式的童鞋,一些基础的语法啥的,可以参考 http://www.cnblogs.com/China3S/archive/2013/11/30/3451971.html 下边是一些我们常 ...

  8. struts2框架学习(二)

    ---恢复内容开始--- 一.搭建步奏 1.新建web项目,进行必备Jar包的拷贝,放到lib目录以便项目的引用. 2.拷贝框架的核心配置文件Struts.xml,放到src目录下,保留一个基本配置即 ...

  9. 如何对Javascript代码进行二次压缩(混淆)

    如何对Javascript代码进行二次压缩(混淆) 对Javascript代码进行压缩(混淆),可以有效减少传输和加载时间.但是,不是所有的变量(方法)都能被混淆的,一般来说,只有非属性的变量(方法) ...

  10. AutoLayout 之NSLayoutConstraint

    这次主要讲的用代码来设置AutoLayout,为实现添加autoLayout视图主要介绍使用如下该方法,调用方法:- (void)awakeFromNib {} +(instancetype)cons ...