线段树(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 ...
随机推荐
- 如何调换antd中Modal对话框确认按钮和取消按钮两个按钮的位置
今天有个工作是把所有的确认按钮放在取消按钮的左边,类似于下图这样的,公司用的时antd组件 但是antd组件的按钮时确认键放在右边的 可以采用下面的方式,将按钮调换过来: 对的,就是在modal里面的 ...
- springmvc+mybatis 处理时间
项目结构: 一.数据库中time的字段为datetime1. 数据库设计如图 2. addNews.jsp <%@ page language="java" contentT ...
- Error:Artifact 'xx.war exploded' has invalid extension
环境信息: IDEA 13 , MAVEN, JBOSS 7. 配置信息: 常规配置. 出错信息: Error:Artifact 'xx.war exploded' has invalid ext ...
- BZOJ 2720: [Violet 5]列队春游
2720: [Violet 5]列队春游 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 189 Solved: 133[Submit][Status] ...
- CF993E Nikita and Order Statistics 【fft】
题目链接 CF993E 题解 我们记小于\(x\)的位置为\(1\),否则为\(0\) 区间由端点决定,转为两点前缀和相减 我们统计出每一种前缀和个数,记为\(A[i]\)表示值为\(i\)的位置出现 ...
- C++接口继承与实现继承的区别和选择
1.接口继承与实现继承的区别 <Effective C++>条款三十四:区分接口继承和实现继承中介绍的比较啰嗦,概括地说需要理解三点: (1)纯虚函数只提供接口继承,但可以被实现: (2) ...
- 【纪中集训2019.3.12】Mas的仙人掌
题意: 给出一棵\(n\)个点的树,需要加\(m\)条边,每条边脱落的概率为\(p_{i}\) ,求加入的边在最后形成图中仅在一个简单环上的边数的期望: \(1 \le n \ , m \le 1 ...
- c动态分配结构体二维数组
这个问题我纠结了蛮久了,因为前面一直忙(自己也懒了点),所以没有能好好研究这个.希望这篇文章能够帮助你们. #include <stdio.h> #include <stdlib.h ...
- iterm2切换显示屏vim乱行解决
http://note.youdao.com/noteshare?id=5aec9d82cc3a95b6909e9966b4aa3227
- 数据科学的完整学习路径—Python版(转载)
时间 2015-01-29 14:14:11 数盟原文 http://dataunion.org/?p=9805 译者: Allen 从Python菜鸟到Python Kaggler的旅程(译注: ...