线段树(dfs序建树加区间更新和单点查询)
题目链接:https://cn.vjudge.net/contest/66989#problem/J
记录一下这道折磨了我一天的题,。。。。
具体思路: 具体关系可通过dfs序建树,但是注意,在更新以及查询时的数和你dfs序建成的数是不一样的。因为你dfs序建成的树每个左右区间以及端点会发生不符合建树的条件。但是具体区间的更新还是可以通过新的树进行更新的,但是下属关系还是符合线段树的规则的,区间越大,也就是管理的人越多,也就是端点越往上。
AC代码;
#include<iostream>
#include<string>
#include<cstring>
#include<iomanip>
#include<map>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<stdio.h>
using namespace std;
# define inf 0x3f3f3f3f
# define maxn 500000+100
# define ll long long
# define lson l,m,rt<<1
# define rson m+1,r,rt<<1|1
vector<int>wakaka[maxn];
int vis[maxn];
int st[maxn];
int ed[maxn];
bool cover[maxn];
int ans;
int num;
int a[maxn];
void init()
{
memset(cover,0,sizeof(a));
memset(vis,0,sizeof(vis));
memset(st,0,sizeof(st));
memset(ed,0,sizeof(ed));
num=0;
}
void cal(int rt,int l,int r)
{
if(a[rt]==-1||l==r)return ;//必须先判断a[rt]是不是-1,如果是-1.则不能往下更新。
a[rt<<1]=a[rt<<1|1]=a[rt];
a[rt]=-1;
}
void dfs(int u)
{
st[u]=++num;
int len=wakaka[u].size();
for(int i=0; i<len; i++)
{
dfs(wakaka[u][i]);
}
ed[u]=num;
}
int query(int p,int l,int r,int rt)
{
if(l==r)//单点查询
{
return a[rt];
}
cal(rt,l,r);
int m=(l+r)>>1;
if(p<=m)query(p,lson);
else if(p>m)query(p,rson);
}
void update(int col,int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
a[rt]=col;
return ;
}
cal(rt,l,r);
int m=(l+r)>>1;
if(L<=m)update(col,L,R,lson);
if(R>m)update(col,L,R,rson);
}
int main()
{
int T;
scanf("%d",&T);
int t=0;
while(T--)
{
int n,u,v;
scanf("%d",&n);
init();
for(int i=1; i<=n; i++){
wakaka[i].clear();
}
memset(a,-1,sizeof(a));
for(int i=1; i<n; i++)
{
scanf("%d%d",&u,&v);
wakaka[v].push_back(u);
vis[u]=1;
}
for(int i=1; i<=n; i++)
{
if(!vis[i])
{
dfs(i);
break;
}
}
int m1;
scanf("%d",&m1);
char str[10];
int t1,t2;
printf("Case #%d:\n",++t);
while(m1--)
{
scanf("%s",str);
if(str[0]=='C')
{
scanf("%d",&t1);
printf("%d\n",query(st[t1],1,n,1));//直接查询单点.
}
else if(str[0]=='T')
{
scanf("%d%d",&t1,&t2);
update(t2,st[t1],ed[t1],1,n,1);//更新区间。
}
}
}
return 0;
}
线段树(dfs序建树加区间更新和单点查询)的更多相关文章
- S - Query on a tree HDU - 3804 线段树+dfs序
S - Query on a tree HDU - 3804 离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...
- Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序
题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s 内存限制:512.0MB 总提交次数:196 AC次数:65 平均分: ...
- BZOJ_3252_攻略_线段树+dfs序
BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...
- 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序
题目大意 Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...
- 【bzoj4817】树点涂色 LCT+线段树+dfs序
Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...
- kb-07线段树--10--dfs序建树
/* hdu3974 dfs序建树,然后区间修改查询: */ #include<iostream> #include<cstdio> #include<cstring&g ...
- HDU 5692 线段树+dfs序
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- BZOJ 4034 线段树+DFS序
思路: 先搞出来每个点的DFS序 (要有入栈和出栈两种状态的) 处理出来 线段树区间有多少入栈的和多少出栈的 加区间的时候就加(入-出)*wei 查前缀和 //By SiriusRen #includ ...
- BZOJ3653谈笑风生——可持久化线段树+dfs序
题目描述 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道 高明到哪里去了”. ? 设a 和 b 为 T 中的两个不同节点.如果 a ...
随机推荐
- 微信小程序 功能函数 把数字1,2,3,4换成春,夏,秋,冬
let season =‘1,2,3’; // console.log(season.length) if (season){ if (season.length==1){ seasonChe1=se ...
- SqlServer日期时间函数
-- 判断是否当天,createdate为日期字段 -- ╔════════════════════╗ -- ============================================= ...
- java static{}块
java中static{}块只有在类加载是才会被调用. 这说明:static只有可能被调用一次. 原因:首先理解什么是类加载,区分类加载和申明对象的区别. public class StaticTes ...
- 用友时空B/S表单外挂(接口)程序操作说明文档
用友时空B/S表单外挂(接口)程序 一.B/S表单接口需求 众所周知,用友时空KSOA支持B/S架构.且移动商务.在线门店,都是完全基于B/S架构的. B/S架构的优越性在于没有本地客户端和本地数据, ...
- Java的StringBuIlder扩容机制
JDK 1.6中,扩容的源码是这样: void expandCapacity(int minimumCapacity) { int newCapacity = (value.length + 1) * ...
- (转)Python中如何理解if __name__ == '__main__'
摘要 通俗的理解 __name__ == '__main__' :假如你叫李凯.py,在朋友眼中,你是李凯( __name__ == '李凯' ):在你自己眼中,你是你自己( __name__ == ...
- 关于OpenGL游戏全屏模式的设置
使用DirectX的API的话可以给游戏窗口设置指定的显示器和全屏独占模式,但是如果使用OpenGL的API就比较遗憾不能直接设置. 以下内容基于Windows系统. 如果使用OpenGL渲染,第一步 ...
- 【刷题】BZOJ 1070 [SCOI2007]修车
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使 ...
- 【BZOJ1801】【Ahoi2009】chess 中国象棋
Time Limit: 10 Sec Memory Limit: 64 MB Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方 ...
- maven使用内嵌tomcat7
在web项目的pom.xml中添加如下: <build> <plugins> <plugin> <groupId>org.apache.tomcat.m ...