hdu 3974 dfs时间戳+线段树
题意:
- 一个公司里面每个员工都有一个顶头上司,一旦给某个员工分配任务后,这个员工以及该员工的所有下属都在做该任务。
- 有若干操作,分配给员工任务以及查询该员工正在执行的任务。
题解:
典型的更新字树的操作,用时间戳来区分子树,然后用线段树做区间的修改和查询。简单介绍一下时间戳(按照dfs的顺寻把一个点第一次遍历的时间点 以及最后一次也就是第二次遍历到的时间点保存下来 具体看下图 会发现一个点的第一次和第二次的时间包含了同样标记的子节点第一次遍历的时间)
序列话之后,用线段树维护查询就好咯,注意一下建树的时候,大小别搞错了,,
上代码:
#include <cstdio>
#include <iostream>
#include <queue>
#include <map>
#include <cstring>
#include <vector>
#define maxn 50010
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
vector<int > edge[maxn];
int n,ret;
int in[maxn*2],out[maxn*2]; // 这里的范围要注意一下
int lazy[maxn*4],val[maxn*4];
int vis[maxn];
void init()
{
ret=0;
for(int i=0;i<=n;i++)
{
edge[i].clear();
vis[i]=0;
}
}
void dfs(int x,int fa)
{
in[x]=++ret;
int len=edge[x].size();
for(int i=0;i<len;i++)
{
if(edge[x][i]!=fa)
{
dfs(edge[x][i],x);
}
}
out[x]=ret;
}
void build(int l,int r,int rt)
{
lazy[rt]=-1;
val[rt]=-1;
if(l==r) return;
int m=(l+r)/2;
build(lson);
build(rson);
}
void pushdown(int rt)
{
if(lazy[rt]!=-1)
{
val[rt<<1]=lazy[rt];
val[rt<<1|1]=lazy[rt];
lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt];
lazy[rt]=-1;
}
}
void update(int L,int R,int key,int l,int r,int rt)
{
if(L<=l && r<=R)
{
lazy[rt]=val[rt]=key;
return;
}
pushdown(rt);
int m=(l+r)/2;
if(L<=m) update(L,R,key,lson);
if(R>m) update(L,R,key,rson);
}
void query(int L,int R,int l,int r,int rt)
{
if(L<=l && r<=R)
{
cout<<val[rt]<<endl;
return;
}
pushdown(rt);
int m=(l+r)/2;
if(L<=m) query(L,R,lson);
if(R>m) query(L,R,rson);
}
int main()
{
int t,Case=0;
cin>>t;
while(t--)
{
cin>>n;
init();
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d %d",&x,&y);
vis[x]=1;
// edge[x].push_back(y);
edge[y].push_back(x);
}
for(int i=1;i<=n;i++)
{
if(vis[i]==0)
{
dfs(i,i);
break;
}
}
build(1,ret,1);// 对dfs序建树 printf("Case #%d:\n",++Case);
int q;
cin>>q;
while(q--)
{
char op[100];
cin>>op;
if(op[0]=='C')
{
int x;
scanf("%d",&x);
query(in[x],in[x],1,ret,1);
}
else
{
int x,y;
scanf("%d %d",&x,&y);
update(in[x],out[x],y,1,ret,1);
}
}
}
return 0;
}
hdu 3974 dfs时间戳+线段树的更多相关文章
- Assign the task HDU - 3974 (dfs序 + 线段树)
有一家公司有N个员工(从1到N),公司里每个员工都有一个直接的老板(除了整个公司的领导).如果你是某人的直接老板,那个人就是你的下属,他的所有下属也都是你的下属.如果你是没有人的老板,那么你就没有下属 ...
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- hdu 5692 Snacks(dfs时间戳+线段树)
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- HDU3974 Assign the task —— dfs时间戳 + 线段树
题目链接:https://vjudge.net/problem/HDU-3974 There is a company that has N employees(numbered from 1 to ...
- HDU 5877 [dfs序][线段树][序]
/* 题意: n个点的树,每个点给定一个权值,给定一个k,求任意一点的子树中,权值小于k/该点权值的点共有多少个. 思路: 1.很明显的子树的操作,应用dfs序. 2.比赛的时候傻逼了,一直在调划分树 ...
- hdu 5692(dfs序+线段树,好题)
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- HDU 3974 Assign the task(dfs时间戳+线段树成段更新)
题意:给定点的上下级关系,规定假设给i分配任务a.那么他的全部下属.都停下手上的工作,開始做a. 操作 T x y 分配x任务y,C x询问x的当前任务: Sample Input 1 5 4 3 3 ...
- HDU 5692 (DFS序+线段树)
DFS获得从0到每一个顶点的距离,同时获得L和R数组.两数组为遍历时从i进入再从i出来的序列. #pragma comment(linker, "/STACK:1024000000,1024 ...
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
随机推荐
- Javascript事件派发-dispatchEvent
事件派发的作用: 1.派发数据,将一个封闭模块中的数据传递给另一个封闭模块.2.事件完成了较为复杂的解耦. 事件和回调函数不同在于: 1.事件可以在任意地方去获取,而回调函数只能在一个地方存在,如果需 ...
- [转]【Windows小技巧】批量重命名文件
注:如果文件名包含空格,命令应写成ren "s0 (1).gif" s001.gif,简而言之,就是加上双引号!!!原因:系统将s0和(1).gif认为是两个参数,再加上后面的s0 ...
- pythonUDP发送结构体,对齐到C++结构体
给出程序先: import random import socket import struct import threading import pickle import json from str ...
- Vue 事件结合双向数据绑定实现todolist 待办事项 已经完成 和进行中
<template> <div id="app"> <input type="text" v-model='todo' @keyd ...
- eclipse中导入spring-boot框架的jar包方法
如下代码引入了spring-boot的包 package openresty; import java.io.IOException; import java.security.GeneralSecu ...
- Python3基础 complex real imag __abs__ 取复数的实部 虚部 模
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- 泡泡一分钟:Visual Odometry Using a Homography Formulation with Decoupled Rotation and Translation Estimation Using Minimal Solutions
张宁 Visual Odometry Using a Homography Formulation with Decoupled Rotation and Translation Estimation ...
- 如何切换svn的登陆账号?
如何切换svn的登陆账号? 听语音 原创 | 浏览:68661 | 更新:2017-10-06 09:09 1 2 3 4 5 6 分步阅读 对于程序员来说,svn使用的比较广泛,平时用来更新或者是提 ...
- Linux系统调优——系统整体运行状态排查(七)
(1).vmstat vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的整体状态值,包括服务器的CPU使用率,MEM内存使用,VMSwap虚拟内存交换情况,IO读写 ...
- Elasticsearch集成Hadoop最佳实践.pdf(内含目录)
Elasticsearch服务器开发(第2版) 介绍: ElasticSearch是一个开源的分布式搜索引擎,具有高可靠性,支持非常多的企业级搜索用例.ElasticsearchHadoop作为一个完 ...