题意:给出一棵树,改变树的一个节点的值,那么该节点及所有子节点都变为这个值。给出m个询问。

思路:DFS序,将树改为线性结构,用线段树维护。start[ ]记录每个节点的编号,End[ ]为该节点的最小子节点的编号,维护线段树时,即是维护start[x] 到End[x]。

代码:

#include<queue>
#include<cstring>
#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<iostream>
#include<algorithm>
#define ll long long
const int N = 50000+5;
const int MOD = 20071027;
using namespace std;
vector<int> g[N];
int tot,start[N],End[N],a[N<<2],vis[N];
void init(){
for(int i = 0; i < N; i++) g[i].clear();
memset(vis,0,sizeof(vis));
tot = 0;
}
void add(int u,int v){ // u is boss
g[u].push_back(v);
vis[v] = 1;
}
void dfs(int x){
start[x] = ++tot;
int len = g[x].size();
for(int i = 0; i < len; i++){
int v = g[x][i];
dfs(v);
}
End[x] = tot;
}
void build(int rt,int l,int r){
if(l == r){
a[rt] = -1;
return;
}
int m = (l + r) >> 1;
build(rt<<1,l,m);
build(rt<<1|1,m+1,r);
a[rt] = -1;
}
void push_down(int rt){
if(a[rt] != -1){
a[rt<<1] = a[rt<<1|1] = a[rt];
a[rt] = -1;
}
}
void update(int rt,int l,int r,int L,int R,int v){
if(L <= l && R >=r){
a[rt] = v;
return;
}
push_down(rt);
int m = (l + r) >> 1;
if(L <= m) update(rt<<1,l,m,L,R,v);
if(R > m) update(rt<<1|1,m+1,r,L,R,v);
}
int query(int rt,int l,int r,int x){
if(l == r){
return a[rt];
}
if(a[rt] != -1){
return a[rt];
}
int ans;
int m = (l + r) >> 1;
if(x <= m) ans = query(rt<<1,l,m,x);
else ans = query(rt<<1|1,m+1,r,x);
return ans;
}
int main(){
int T,n,u,v,m,num = 1;
char order[2];
scanf("%d",&T);
while(T--){
scanf("%d",&n);
init();
for(int i = 0; i < n-1; i++){
scanf("%d%d",&v,&u);
add(u,v);
}
for(int i = 1; i <= n; i++){
if(!vis[i]){
dfs(i);
break;
}
}
build(1,1,n);
scanf("%d",&m);
printf("Case #%d:\n",num++);
while(m--){
scanf("%s",order);
if(order[0] == 'C'){
scanf("%d",&u);
printf("%d\n",query(1,1,n,start[u]));
}
else{
scanf("%d%d",&u,&v);
update(1,1,n,start[u],End[u],v);
}
}
}
return 0;
}

HDU 3974 Assign the task(DFS序)题解的更多相关文章

  1. HDU 3974 Assign the task(DFS序+线段树单点查询,区间修改)

    描述There is a company that has N employees(numbered from 1 to N),every employee in the company has a ...

  2. HDU 3974 Assign the task (DFS序 + 线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3974 给你T组数据,n个节点,n-1对关系,右边的是左边的父节点,所有的值初始化为-1,然后给你q个操 ...

  3. HDU 3974 Assign the task(dfs建树+线段树)

    题目大意:公司里有一些员工及对应的上级,给出一些员工的关系,分配给某员工任务后,其和其所有下属都会进行这项任务.输入T表示分配新的任务, 输入C表示查询某员工的任务.本题的难度在于建树,一开始百思不得 ...

  4. HDU 3974 Assign the task (DFS+线段树)

    题意:给定一棵树的公司职员管理图,有两种操作, 第一种是 T x y,把 x 及员工都变成 y, 第二种是 C x 询问 x 当前的数. 析:先把该树用dfs遍历,形成一个序列,然后再用线段树进行维护 ...

  5. [Assign the task][dfs序+线段树]

    http://acm.hdu.edu.cn/showproblem.php?pid=3974 Assign the task Time Limit: 15000/5000 MS (Java/Other ...

  6. hdu 3974 Assign the task(dfs序上线段树)

    Problem Description There is a company that has N employees(numbered from 1 to N),every employee in ...

  7. HDU 3974 Assign the task 暴力/线段树

    题目链接: 题目 Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...

  8. HDU 3974 Assign the task 并查集/图论/线段树

    Assign the task Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...

  9. hdu3974 Assign the task dfs序+线段树

    There is a company that has N employees(numbered from 1 to N),every employee in the company has a im ...

随机推荐

  1. Eclipse+Pydev 搭建开发环境(转)

    add by zhj: 对原文略有修改 原文:http://www.cnblogs.com/TankXiao/archive/2013/05/29/3033640.html C#之所以容易让人感兴趣, ...

  2. visual studio code 编辑器的配置及快捷键等, vscode, csc

    visual studio code (vsc) 对开发node.js,javascript,python,html,golang等比较友好,同时支持git浏览及分屏对比,运行速度快,所以是值得一用的 ...

  3. spring boot读取配置文件

    一.springboot配置文件 核心配置文件和自定义配置文件.核心配置文件是指在resources根目录下的application.properties或application.yml配置文     ...

  4. 顺序结构,判断结构 if,switch

    1:顺序结构:从上往下执行程序代码,为顺序结构 ---------------------------------------------------------------------- 2:判断结 ...

  5. 如何调用另一个python文件中的代码

    模块的搜索路径 模块的搜索路径都放在了sys.path列表中,如果缺省的sys.path中没有含有自己的模块或包的路径,可以动态的加入(sys.path.apend)即可.下面是sys.path在Wi ...

  6. 阻止提交按钮的默认 action

    使用 preventDefault() 函数来阻止对表单的提交. 示例代码如下: <html><head><script type="text/javascri ...

  7. SqlAlchemy个人学习笔记完整汇总-转载

    使用 sqlalchemy 有3种方式: 方式1, 使用raw sql; 方式2, 使用SqlAlchemy的sql expression; 方式3, 使用ORM.   前两种方式可以统称为 core ...

  8. [LeetCode] 116&117. Populating Next Right Pointers in Each Node I&II_Medium tag: BFS(Dont know why leetcode tag it as DFS...)

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  9. 代码编译 Compile、Make、Build 的区别

    代码编译 Compile.Make.Build 的区别 https://blog.csdn.net/fanzheng220112583/article/details/7780250 VC++6.0中 ...

  10. jquery 的each函数

    each函数经常用到.它本身就是一个循环遍历 你可以可以break continue 但这是在for while循环中 each中我们可以这样 下面的例子是遍历 MyTable中所有的tr 第一个td ...