/*
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. 远程桌面连接(mstsc)无法断开的解决方案

    某2008 r2有二个系统账户,同时允许两个tcp连接,但每个用户仅同时允许一人登录.不知何因,关闭远程桌面连接的窗口后,再次连接就瞬间提示无法被连接.查看了事件查看器,信息为被注销,这是因为设置了“ ...

  2. Lemonade Trade

    4990: Lemonade Trade 时间限制: 1 Sec  内存限制: 128 MB  Special Judge提交: 88  解决: 17[提交][状态][讨论版][命题人:admin] ...

  3. Where do I belong-freecodecamp算法题目

    Where do I belong(数组排序并找出元素索引) 要求 给数组排序 找到指定的值在数组的位置,并返回位置对应的索引. 思路 设定.sort()需要的返回函数 将要搜索的值添加到数组内 用. ...

  4. 使用linux安装gitolite管理git

    系统:centos7 服务器:阿里云 一.前期准备 1.安装git yum install git 2.安装perl yum install perl 3.安装openssh yum install ...

  5. VMware安装Ubuntu配置NAT模式下静态IP,解决访问外网问题

    安装好VMware后,打开网络连接可以看到有VMware Network Adapter VMnet1和VMware Network Adapter VMnet8两个网络适配器,VMnet1是针对桥接 ...

  6. graph-bfs-八数码问题

    这个看起来是童年回忆:) 大体思路是,将每个排列状态看成图中的一个点,状态之间转换说明有边.然后用bfs,如果遍历完之后还是没有找到目标状态, 则说明是无解的,否则输出步数.具体想法写在代码里吧,多多 ...

  7. cf 1016C

    C. Vasya And The Mushrooms time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  8. cento命令之which、whereis、locate、find

    [which] 查看可执行文件的位置 语法: [root@localhost ~]# which 可执行文件名称 例如: [root@localhost ~]# which passwd /usr/b ...

  9. python爬取+使用网易卡搭作品数量api

    第一步,当然是打开浏览器~ 然后打开卡搭~ 看着熟悉的界面,是不是有点不知所措? 这就对了,咱找点事情干干. 随便找个倒霉蛋,比如这位:"混世大王",打开他的主页! 按下f12(我 ...

  10. java处理excel

    JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过 ...