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序+先段数区间查询修改+二进制保存状态】的更多相关文章
- New Year Tree 【DFS序+线段树区间查询修改+二进制保存状态】
题目链接[http://codeforces.com/problemset/problem/620/E] 题意:给出n个数,每个数有一个初始的颜色.由这n个数组成一颗树.有两种操作1.将以节点u为根的 ...
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
- 【bzoj3779】重组病毒 LCT+树上倍增+DFS序+树状数组区间修改区间查询
题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作 ...
- [poj3321]Apple Tree(dfs序+树状数组)
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26762 Accepted: 7947 Descr ...
- 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 ...
- poj 3321 Apple Tree dfs序+线段树
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Description There is an apple tree outsid ...
- 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 ...
- 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/ ...
- POJ3321Apple Tree Dfs序 树状数组
出自——博客园-zhouzhendong ~去博客园看该题解~ 题目 POJ3321 Apple Tree 题意概括 有一颗01树,以结点1为树根,一开始所有的结点权值都是1,有两种操作: 1.改变其 ...
随机推荐
- head first--------------------template method pattern
head first---------模板方法模式 浅谈谈模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义 ...
- Haxe2.10到Haxe3,NME到OpenFL的迁移备忘
终于决定正式向Haxe3和OpenFL迁移了,这期间也遇到不少问题,这里总结记录如下: 首先是Haxe3环境 * 因为还想保留Haxe 2.10的环境,因此没有使用官网的Haxe 3安装包,而是下载了 ...
- ASP.NET Zero--5.配置权限
修改角色的时候,会有一份权限列表,可以给这个角色分配哪些权限,那如何添加一个新权限呢? 这里以添加一个“测试”的权限为例 1.打开AppPermissions.cs [..\MyCompanyNa ...
- 汇编条件判断整理(JCC,CMP/TEST的实现)
比较的实现 我们知道CMP是比较两个寄存器内容的指令,但这是如何实现的? 当执行到CMP指令的时候会读取这两个寄存器的内容,并加以减法运算,结果本身不保留,并按照结果设置符号位(属算术运算). CMP ...
- 结构-行为-样式-Javascript 深度克隆函数(转)
突然想到有一回面试的时候有一个问题一直挂在心头,于是乎在网上找了找,这个比较好: //深度克隆 function deepClone(obj) { var result, oClass = isCla ...
- 关于C/C++中的“auto”
C/C++ 98标准 C++03标准 意思完全一样:auto被解释为一个自动存储变量的关键字,也就是申明一块临时的变量内存.auto的出现意味着,当前变量的作用域为当前函数或代码段的局部变量,意味着当 ...
- pb_ds(平板电视)整理
有人说BZOJ3040用普通的<queue>中priority_queue搞dijkstra过不了. 我只想说你们的djk可能写的太丑了. 先上代码 #include<iostrea ...
- 将WebApi Host到控制台和IIS
近期学习WebApi,初步感想是用起来很容易上手,概念上也很好理解,唯一不爽的地方就在于如果在Visual Studio环境里建立Webapi程序,它会自动给创建很多文件夹和文件,其中很多都是用不到的 ...
- hdu1041
#include <iostream> #include <string> using namespace std; const int SIZE = 1001; const ...
- 使用ObjectInputStream和ObjectOutputStream注意问题
1.对象序列化,类实现Serializable接口 不需要序列化的属性,使用transient声明 2.使用套接字流在主机之间传递对象注意问题: 学习自:Socket同时使用ObjectInputSt ...