题目链接【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. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

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

  2. POJ 3321 Apple Tree(DFS序+线段树单点修改区间查询)

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25904   Accepted: 7682 Descr ...

  3. POJ3321 - Apple Tree DFS序 + 线段树或树状数组

    Apple Tree:http://poj.org/problem?id=3321 题意: 告诉你一棵树,每棵树开始每个点上都有一个苹果,有两种操作,一种是计算以x为根的树上有几个苹果,一种是转换x这 ...

  4. Codeforces Round #225 (Div. 2) E. Propagating tree dfs序+-线段树

    题目链接:点击传送 E. Propagating tree time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

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

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

  6. codechef T6 Pishty and tree dfs序+线段树

    PSHTTR: Pishty 和城堡题目描述 Pishty 是生活在胡斯特市的一个小男孩.胡斯特是胡克兰境内的一个古城,以其中世纪风格 的古堡和非常聪明的熊闻名全国. 胡斯特的镇城之宝是就是这么一座古 ...

  7. codeforces 620E. New Year Tree dfs序+线段树+bitset

    题目链接 给一棵树, 每个节点有颜色, 两种操作, 一种是将一个节点的子树全都染色成c, 一种是查询一个节点的子树有多少个不同的颜色, c<=60. 每个节点一个bitset维护就可以. #in ...

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

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

  9. Codeforces 343D Water Tree(DFS序 + 线段树)

    题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...

随机推荐

  1. JavaScript 数组操作:slice vs splice

    在 JavaScript 中,对于数组的操作有两个很容易混淆的方法 splice, slice ,这里给大家推荐一篇介绍 splice, slice 二者区别的文章. In JavaScript, m ...

  2. 【洛谷 P4291】 [HAOI2008]排名系统(Splay,Trie)

    题目链接 不是双倍经验我会去\(debug\)一上午? 一开始我是用的\(map+string\),跑的太慢了,T了4个点. 后来我手写了\(string\),重载了小于号,依然用的\(map\),T ...

  3. git常用命令速查表【转】

  4. SurfaceFlinger 讲解

    SurfaceFlinger是Android multimedia的一个部分,在Android 的实现中它是一个service,提供系统 范围内的surface composer功能,它能够将各种应用 ...

  5. USB基础介绍

    (转)USB (Universal Serial Bus) 全文地址:http://vlewang.blog.163.com/blog/static/105878151201032804347546/ ...

  6. 使用 Xtrabackup 在线对MySQL做主从复制【转】

    1. 说明 1.1 xtrabackup mysqldump对于导出10G以下的数据库或几个表,还是适用的,而且更快捷.一旦数据量达到100-500G,无论是对原库的压力还是导出的性能,mysqldu ...

  7. C#开发微信公众平台开发-微信海报介绍和开发流程

    “让客户发展客户”,微信海报才是微信公众平台最高明的吸粉手段,海报上有粉丝的专属二维码,有粉丝的头像及商户宣传的广告等.新粉丝扫描这个专属二维码会关注公众号,同时分享海报的粉丝会增加积分换取礼品或者优 ...

  8. openstack环境下的虚拟机通过浮动IP访问后能ping通外网IP不能ping通域名

    1.环境简介 openstack环境下构造Ubuntu系统的VM,VM配置受管子网和自管子网,同时绑定浮动IP 2.通过浮动IP访问VM后,ping www.baidu.com失败,但是通过IP地址p ...

  9. 自动ftp 上传

    #!/bin/sh ftp -n<<END_FTP open 192.168.1.4 user codfei duibuqi //用户名codfei 密码duibuqi binary pr ...

  10. 最全Pycharm教程(26)——Pycharm搜索导航之文件名、符号名搜索(转)

    1.准备一个工程 向你的工程中添加一个Python文件,并输入一些源码,例如: 2.转到对应文件.类.符号 Pycharm提供的一个很强力的功能就是能够根据名称跳转到任何文件.类.符号所在定义位置. ...