/*
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. Java 守护线程(Daemon) 例子

    当我们在Java中创建一个线程,缺省状态下它是一个User线程,如果该线程运行,JVM不会终结该程序.当一个线被标记为守护线程,JVM不会等待其结束,只要所有用户(User)线程都结束,JVM将终结程 ...

  2. Opencascade术语笔记。

    1. chamfer 倒角 vs fillet  圆角: 2.boolean operatiron(布尔操作): common(相加),fuse(相交),cut(相减): 3.depressions( ...

  3. .vue公共组件裁减导航

    场景: 有一个公共头部和底部,vue搭建的框架,在app.vue里写的公共方法,首页是个登录页面,不需要公共部分,在这基础上进行公共部分的显示隐藏. 即注册页.登录页.404页面都不要导航 代码: ( ...

  4. Python 模块(二)

    1 logging 模块 logging有两种的配置的方式,configure.logger 1.1 config方式 import logging ''' 日志的配置:config模式 只能选择在屏 ...

  5. JS实用技术

    JS外部引用其他文件(建议) <script src="myScript1.js"></script> JS输出显示方式 使用 window.alert() ...

  6. 01_4_SERVLET声明周期

    01_4_SERVLET声明周期 1. Servlet的生命周期 生命全过程 加载ClassLoader 实例化 new //客户端第一次请求的时候,只new一次 初始化init(ServletCon ...

  7. iOS 后台传输服务

    后台传输服务 — 我们用水壶来比喻 (0:14) 后天传输服务是 iOS 7 引进的 API,它准许应用暂停或者中止之后,在后台继续执行网络服务(比如下载或者上传).举个例子,这正是 Dropbox ...

  8. iOS开发之MVVM在项目中的应用

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  9. 关于UINavigationController的一些技巧

    未自定义任何东西的导航条效果如下: 1.自定义了 leftBarButtonItem 之后,左滑返回手势失效了,解决办法: self.navigationController.interactiveP ...

  10. Bzoj 3450: Tyvj1952 Easy (期望)

    Bzoj 3450: Tyvj1952 Easy 这里放上题面,毕竟是个权限题(洛谷貌似有题,忘记叫什么了) Time Limit: 10 Sec Memory Limit: 128 MB Submi ...