/*
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. Linux OpenGL 实践篇-16 文本绘制

    文本绘制 本文主要射击Freetype的入门理解和在OpenGL中实现文字的渲染. freetype freetype的官网,本文大部分内容参考https://www.freetype.org/fre ...

  2. UVA 11925 Generating Permutations 生成排列 (序列)

    题意:要用一个有序的序列生成给定序列,操作有两种,一是交换前两个元素,二是把第一个元素移动到最后去. 思路有两种: 1.映射,把给定序列映射成有序的序列,然后按照同样的替换规则把有序的序列映射掉,然后 ...

  3. 2018.2.10 使用SSH连接远程滴滴云服务器Ubuntu (Windows下) 及 putty工具永久设置字体、颜色

    一开始会有人问云服务器是什么? 云服务器是一种类似VPS服务器的虚拟化技术, VPS是采用虚拟软件,VZ或VM在一台服务器上虚拟出多个类似独立服务器的部分,每个部分都可以做单独的操作系统,管理方法同服 ...

  4. linux目录结构及文件管理

    Linux的目录结构: /            根分区 linux文件系统的起点 /bin           普通用户的命令,普通用户能使用 /sbin         管理员使用的命令,只有管理 ...

  5. Stream great concerts wherever you are

    This time of year, we take stock of what we're thankful for — and above all else, we’re thankful for ...

  6. SC || Chapter 8

    栈:方法调用和局部变量的存储位置,保存基本类型 堆:在一块内存里分为多个小块,每块包含 一个对象,或者未被占用

  7. C# 用qq邮箱发邮件

    一.在企业的QQ邮箱中开启POP3/SMTP服务 开启服务时,授权密码保存好. 二.示例 public static string UserName = ""; // 企业邮箱 p ...

  8. 浅谈一类「AC自动机计数」问题

    最近写了几道AC自动机的题.这几题主要考察的是对AC自动机的浅层理解套上计数. 几道计数题 [AC自动机]bzoj3172: [Tjoi2013]单词 把被动贡献看成主动贡献. [状态压缩dp]119 ...

  9. CentOS 7.4 基于LNMP搭建wordpress

    之前有好多次搭建wordpress的经历,有在Ubuntu系统上,有在CentOS7.2系统上,但都是搭完还是稀里糊涂的,因为好多都是教程上照着敲的.这次好好出个教程,以便以后方便查看. 准备工作:C ...

  10. 【Python学习之七】递归——汉诺塔问题的算法理解

    汉诺塔问题 汉诺塔的移动可以用递归函数非常简单地实现.请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A.B.C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的 ...