/*
hdu3974
dfs序建树,然后区间修改查询;
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX_N 50005
using namespace std; int N,M;
struct Node
{
int to,next;
}edge[MAX_N];
struct TREE
{//val记录的是区间;
int l,r,val,lazy;
}tr[MAX_N*];
int head[MAX_N],cnt,tot;
int Start[MAX_N],End[MAX_N]; void Addedge(int u,int v)//链式前向星存图;
{
//tot是边的编号;
edge[tot].to=u;//以v为起点的边;终点是u;
edge[tot].next=head[v];//这条边的下一条边是几号边,依然是v为起点的边;
head[v]=tot++;//更新v为起点的边的入口;
}
void dfs(int x)
{
cnt++;//初始为0;这里是1了,从1开始编号;
Start[x]=cnt;//起点是x的编号
for(int i=head[x];i!=-;i=edge[i].next)//遍历以v为起点的边;
{
dfs(edge[i].to);
}
End[x]=cnt;//遍历完子树后可以得到这个树根的编号范围就是star&end;
//dfs先根遍历,把x为根的子树的所有的节点编号在一段区间内,连续编号,并且记录该区间的编号起始和结束,当线段树修改值的时候就直接修改该区间;
}
void build(int rt,int l,int r)
{
tr[rt].l=l;
tr[rt].r=r;
tr[rt].val=-;
tr[rt].lazy=;
if(l==r)
return;
int mid=(l+r)/;
build(rt<<,l,mid);
build(rt<<|,mid+,r);
}
void Pushdown(int rt)
{
int ls=rt<<,rs=rt<<|;
if(tr[rt].lazy)
{
tr[rs].val=tr[ls].val=tr[rt].val;
tr[rs].lazy=tr[ls].lazy=;
tr[rt].lazy=;
}
}
void Update(int rt,int l,int r,int x)
{
if(tr[rt].l==l&&tr[rt].r==r)
{
tr[rt].val=x;
tr[rt].lazy=;
return ;
}
Pushdown(rt);
int ls=rt<<,rs=rt<<|;
if(l<=tr[ls].r)
{
if(r<=tr[ls].r)
Update(ls,l,r,x);
else
Update(ls,l,tr[ls].r,x);
}
if(r>=tr[rs].l)
{
if(l>=tr[rs].l)
Update(rs,l,r,x);
else
Update(rs,tr[rs].l,r,x);
}
}
int Query(int rt,int a)
{
if(tr[rt].l==a&&tr[rt].r==a)
{
return tr[rt].val;
}
Pushdown(rt);
int mid=(tr[rt].l+tr[rt].r)/;
if(a<=mid)
return Query(rt<<,a);
else
return Query(rt<<|,a);
}
int main()
{
int T,k=;
cin>>T;
while(T--)
{
printf("Case #%d:\n",k++);
cnt=;
tot=;
memset(edge,,sizeof(edge));
memset(head,-,sizeof(head));
memset(Start,-,sizeof(Start));
memset(End,-,sizeof(End));
bool used[MAX_N];
memset(used,false,sizeof(used));
cin>>N;
for(int i=;i<N-;i++)
{
int u,v;
cin>>u>>v;//v是u的上级;
used[u]=true ;//表示u是有上级的,也就是有入度的;
Addedge(u,v);
}
for(int i=;i<=N;i++)
{
if(!used[i])//找到入度为0的点,就是整个树的入口;
{
dfs(i);
break;
}
}
build(,,N);
cin>>M;
for(int i=;i<M;i++)
{
char a[];
scanf("%s",a);
if(a[]=='C')
{
int x;
cin>>x;
int ans=Query(,Start[x]);//该点的编号就是起点的编号;
cout<<ans<<endl;
}
else
{
int a,b;
cin>>a>>b;
Update(,Start[a],End[a],b);
}
} }
return ;
}

kb-07线段树--10--dfs序建树的更多相关文章

  1. 线段树(dfs序建树加区间更新和单点查询)

    题目链接:https://cn.vjudge.net/contest/66989#problem/J 记录一下这道折磨了我一天的题,.... 具体思路: 具体关系可通过dfs序建树,但是注意,在更新以 ...

  2. CF877E Danil and a Part-time Job 线段树维护dfs序

    \(\color{#0066ff}{题目描述}\) 有一棵 n 个点的树,根结点为 1 号点,每个点的权值都是 1 或 0 共有 m 次操作,操作分为两种 get 询问一个点 x 的子树里有多少个 1 ...

  3. P3703 [SDOI2017]树点涂色 LCT维护颜色+线段树维护dfs序+倍增LCA

    \(\color{#0066ff}{ 题目描述 }\) Bob有一棵\(n\)个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点 ...

  4. bzoj 3779: 重组病毒【LCT+线段树维护dfs序】

    %.8lf会WA!!%.8lf会WA!!%.8lf会WA!!要%.10lf!! 和4817有点像,但是更复杂. 首先对于操作一"在编号为x的计算机中植入病毒的一个新变种,在植入一个新变种时, ...

  5. Successor HDU - 4366 (预处理,线段树,dfs序)

    Successor HDU - 4366 Sean owns a company and he is the BOSS.The other Staff has one Superior.every s ...

  6. 背单词(AC自动机+线段树+dp+dfs序)

    G. 背单词 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较   题目描述 给定一张包含N个单词的表,每个单词有个价值W.要求从中选出一个子序列使 ...

  7. 2018.11.01 NOIP训练 图论(线段树+倍增+dfs序)

    传送门 一道挺妙的题. 对于询问点(u,v),如右图所示,我们可以发现存在一个点m在u->v的路径中,m子树的点到u是最近的,m子树外到v是最近的.其中dis(u,m)=(dis(u,v)-1) ...

  8. CF620E New Year Tree 状压+线段树(+dfs序?)

    借用学长的活:60种颜色是突破口(我咋不知道QAQ) 好像这几道都是线段树+dfs序??于是你可以把60种颜色压进一个long long 里,然后向上合并的时候与一下(太妙了~) 所以记得开long ...

  9. 【HIHOCODER 1576】 子树中的最小权值(线段树维护DFS序)

    描述 给定一棵N个节点的树,编号1~N.其中1号节点是根,并且第i个节点的权值是Vi. 针对这棵树,小Hi会询问小Ho一系列问题.每次小Hi会指定一个节点x,询问小Ho以x为根的子树中,最小的权值是多 ...

  10. BZOJ 4817 [SDOI2017]树点涂色 (LCT+线段树维护dfs序)

    题目大意:略 涂色方式明显符合$LCT$里$access$操作的性质,相同颜色的节点在一条深度递增的链上 用$LCT$维护一个树上集合就好 因为它维护了树上集合,所以它别的啥都干不了了 发现树是静态的 ...

随机推荐

  1. 浅谈iOS学习之路

    转眼学习iOS已经快两年的时间了,这个路上有挫折也有喜悦,一步步走过来发现这个过程是我这一辈子的财富,我以前的老大总是对我说,年轻就是最大的资本(本人91年),现在才算是慢慢的体会到,反观自己走过的这 ...

  2. 通过WMIC导出系统日志

    查看日志类型 wmic nteventlog get filename C:\>wmic nteventlog get filename FileName appevent secevent s ...

  3. cookie和session是否可以保存对象

    session看了一下,是可以保存对象的.语法很普通,但是cookie的话本身是只能保存string类型的信息的,这就需要先序列化,然后接收的页面反序列化后形成对象调用,为了防止乱码,需要在数据传输的 ...

  4. CodeForces 77C Beavermuncher-0xFF (树形dp)

    不错的树形dp.一个结点能走多次,树形的最大特点是到达后继的路径是唯一的,那个如果一个结点无法往子结点走,那么子结点就不用考虑了. 有的结点不能走完它的子结点,而有的可能走完他的子节点以后还会剩下一些 ...

  5. Spark源码分析之-Storage模块

    原文链接:http://jerryshao.me/architecture/2013/10/08/spark-storage-module-analysis/ Background 前段时间琐事颇多, ...

  6. axios的post请求方法---以Vue示例

    Axios向后端提交数据的参数格式是json,而并非用的是form传参,post表单请求提交时,使用的Content-Type是application/x-www-form-urlencoded,而使 ...

  7. html5新结构标签

    html5新结构标签 <header>  定义 section 或 page 的页眉,也就是定义头部的标签. <footer> 定义 section 或 page 的页脚. & ...

  8. sphinx中文入门指南 (转自sphinx中文站)

    Sphinx中文入门指南 wuhuiming<blvming在gmail.com>,转载请注明来源和作者 最后修改:2010年1月23日 1.简介 1.1.Sphinx是什么 1.2.Sp ...

  9. python 项目中包中__init__.py文件的作用

    开发python项目时,我遇到了一个这样的现象,当我新建一个pythonpackage时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很不了解这个空文件的作用是什么, ...

  10. 实验4 —— [bx]和loop的使用

    实验 综合使用 loop.[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个字单元重复填充字数据 0403H. 以下为示例程序: assume cs:code # 1 c ...