New Year Tree 【DFS序+线段树区间查询修改+二进制保存状态】
题目链接【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序+线段树区间查询修改+二进制保存状态】的更多相关文章
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
- POJ 3321 Apple Tree(DFS序+线段树单点修改区间查询)
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25904 Accepted: 7682 Descr ...
- POJ3321 - Apple Tree DFS序 + 线段树或树状数组
Apple Tree:http://poj.org/problem?id=3321 题意: 告诉你一棵树,每棵树开始每个点上都有一个苹果,有两种操作,一种是计算以x为根的树上有几个苹果,一种是转换x这 ...
- 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 ...
- poj 3321 Apple Tree dfs序+线段树
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Description There is an apple tree outsid ...
- codechef T6 Pishty and tree dfs序+线段树
PSHTTR: Pishty 和城堡题目描述 Pishty 是生活在胡斯特市的一个小男孩.胡斯特是胡克兰境内的一个古城,以其中世纪风格 的古堡和非常聪明的熊闻名全国. 胡斯特的镇城之宝是就是这么一座古 ...
- codeforces 620E. New Year Tree dfs序+线段树+bitset
题目链接 给一棵树, 每个节点有颜色, 两种操作, 一种是将一个节点的子树全都染色成c, 一种是查询一个节点的子树有多少个不同的颜色, c<=60. 每个节点一个bitset维护就可以. #in ...
- CodeForces 620E:New Year Tree(dfs序+线段树)
E. New Year Treetime limit per test3 secondsmemory limit per test256 megabytesinputstandard inputout ...
- Codeforces 343D Water Tree(DFS序 + 线段树)
题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...
随机推荐
- ajax做显示信息以后用ajax、Bootstrp做弹窗显示信息详情
1.用ajax做弹窗显示信息详情 nation.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu ...
- array_unshift() 函数
出处:http://www.w3school.com.cn/php/func_array_unshift.asp
- Spring Cloud全家桶主要组件及简要介绍
一.微服务简介 微服务是最近的一两年的时间里是很火的一个概念.感觉不学习一下都快跟不上时代的步伐了,下边做一下简单的总结和介绍. 何为微服务?简而言之,微服务架构风格这种开发方法,是以开发一组小型服务 ...
- bzoj 3522 tree-dp 暴力
首先我们知道,这个题可以N^2的做,我们先确定一个根,然后讨论下情况,合法的三个点只可能有三种情况,第一种是三个点有相同的lca,这种情况我们可以用tree-dp来解决,用dis[i][j]表示i为根 ...
- php常用函数——数学函数
php常用函数——数学函数
- oracle数据库只查询前n条
select * from (select * from tablename order by createdate desc) aaa -- 按创建时间倒排序 where rownum &l ...
- PHP 不让标准浏览器(firfox,chrome等)走浏览器的缓存页面
或在HTML页面里加: <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache,no-store, must-reva ...
- openjudge-NOI 2.6-1808 公共子序列
题目链接:http://noi.openjudge.cn/ch0206/1808/ 题解: 裸题…… #include<cstdio> #include<cstring> #d ...
- Vue.js写一个SPA登录页面的过程
技术栈 vue.js 主框架 vuex 状态管理 vue-router 路由管理 一般过程 在一般的登录过程中,一种前端方案是: 检查状态:进入页面时或者路由变化时检查是否有登录状态(保存在cooki ...
- python从2.6.x升级到2.7.x
[前提] 今日是20171207,目前Linux发行版默认安装的Python版本都是2.6.x,但是这个版本Python已经不再进行维护了. 所以需要将Python做一个升级,到2.7.x [注意] ...