HDU 3974 Assign the task
Assign the task
The company usually assigns some tasks to some employees to finish.When a task is assigned to someone,He/She will assigned it to all his/her subordinates.In other words,the person and all his/her subordinates received a task in the same time. Furthermore,whenever a employee received a task,he/she will stop the current task(if he/she has) and start the new one.
Write a program that will help in figuring out some employee’s current task after the company assign some tasks to some employee.
For each test case:
The first line contains an integer N (N ≤ 50,000) , which is the number of the employees.
The following N - 1 lines each contain two integers u and v, which means the employee v is the immediate boss of employee u(1<=u,v<=N).
The next line contains an integer M (M ≤ 50,000).
The following M lines each contain a message which is either
"C x" which means an inquiry for the current task of employee x
or
"T x y"which means the company assign task y to employee x.
(1<=x<=N,0<=y<=10^9)
- #include<iostream>
- #include<algorithm>
- #include<cstring>
- #include<cstdio>
- using namespace std;
- const int maxn = ;
- struct node{
- int to,next;
- }e[maxn];
- int a[maxn<<],add[maxn<<];
- int f[maxn],head[maxn];
- int ls[maxn],rs[maxn];
- int n,m,T,cnt,num;
- void ade(int u,int v)//加边 便于dfs搜索
- {
- e[cnt].to = u;
- e[cnt].next = head[v];
- head[v] = cnt++;
- }
- int Find(int x){//并查集
- if(x!=f[x])
- f[x] = Find(f[x]);
- return f[x];
- }
- void dfs(int rt)//求出当前节点覆盖的区间左值和右值
- {
- int x = head[rt];
- ls[rt] = ++num;
- while(x!=-){
- dfs(e[x].to);
- x = e[x].next;
- }
- rs[rt] = num;
- }
- void pushdown(int rt)
- {
- if(add[rt]){
- a[rt<<] = a[rt];
- a[rt<<|] = a[rt];
- add[rt<<] = add[rt];
- add[rt<<|] = add[rt];
- add[rt] = ;
- }
- }
- void build(int l,int r,int rt)
- {
- a[rt] = -;//
- add[rt] = ;//此处初始化所有点线段树节点都为-1和0;
- if(l==r)return;
- int mid = (l+r)>>;
- build(l,mid,rt<<);
- build(mid+,r,rt<<|);
- }
- void update(int L,int R,int C,int l,int r,int rt)
- {
- if(L<=l&&r<=R){
- a[rt] = C;
- add[rt] = C;
- return;
- }
- pushdown(rt);//下推懒惰标记
- int mid = (l+r)>>;
- if(L<=mid)update(L,R,C,l,mid,rt<<);
- if(R>mid)update(L,R,C,mid+,r,rt<<|);
- }
- int query(int L,int R,int l,int r,int rt)
- {
- if(L<=l&&r<=R)return a[rt];
- pushdown(rt);//下推懒惰标记
- int mid = (l+r)>>;
- int ans = ;
- if(L<=mid) ans += query(L,R,l,mid,rt<<);
- if(R>mid) ans += query(L,R,mid+,r,rt<<|);
- return ans;
- }
- int main()
- {
- scanf("%d",&T);
- for(int t=;t<=T;t++){
- scanf("%d",&n);
- cnt = ,num = ;
- for(int i=;i<=n;i++){
- f[i]=i;head[i]=-;
- ls[i]=,rs[i]=;
- }
- for(int l,r,i=;i<n;i++){
- scanf("%d%d",&l,&r);
- f[l]=r;
- ade(l,r);
- }
- int root = Find();//利用并查集的思想求出根节点
- dfs(root);//根据根节点 求出每个节点覆盖的区间 区间左值在ls中,右值在rs中
- // cout<<ls[root]<<" "<<rs[root]<<endl;
- // for(int i=1;i<=n;i++)
- // cout<<ls[i]<<" "<<rs[i]<<endl;
- // getchar();
- build(,n,);
- scanf("%d",&m);
- char op;int x,y;
- printf("Case #%d:\n",t);
- while(m--){
- scanf(" %c",&op);
- if(op=='C'){
- scanf("%d",&x);
- printf("%d\n",query(ls[x],ls[x],,n,));//区间的单点查询
- }else if(op=='T'){
- scanf("%d%d",&x,&y);
- update(ls[x],rs[x],y,,n,);//区间更新当前的任务
- }
- }
- }
- return ;
- }
HDU 3974 Assign the task的更多相关文章
- HDU 3974 Assign the task 并查集/图论/线段树
Assign the task Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...
- HDU 3974 Assign the task 暴力/线段树
题目链接: 题目 Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- HDU 3974 Assign the task(简单线段树)
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 3974 Assign the task (DFS序 + 线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3974 给你T组数据,n个节点,n-1对关系,右边的是左边的父节点,所有的值初始化为-1,然后给你q个操 ...
- 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 ...
- HDU 3974 Assign the task 并查集
http://acm.hdu.edu.cn/showproblem.php?pid=3974 题目大意: 一个公司有N个员工,对于每个员工,如果他们有下属,那么他们下属的下属也是他的下属. 公司会给员 ...
- hdu 3974 Assign the task(线段树)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3974 题意:给定一棵树,50000个节点,50000个操作,C x表示查询x节点的值,T x y表示更 ...
- hdu 3974 Assign the task (线段树+树的遍历)
Description There is a company that has N employees(numbered from 1 to N),every employee in the comp ...
- hdu 3974 Assign the task(dfs序上线段树)
Problem Description There is a company that has N employees(numbered from 1 to N),every employee in ...
随机推荐
- pl/sql基础知识—包
n 包 包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成. 为什么需要包:使用包可以更好的管理自己写的函数.过程 ①我们可以使用create package命令来创建包: creat ...
- PLAY2.6-SCALA(三) 数据的返回与保存
1.修改默认的Content-Type 自动设置内容类型为text/plain val textResult = Ok("Hello World!") 自动设置内容类型为appli ...
- IIS 设置 FTP 服务器 添加多个账户
我们有很多童鞋经常开不动IIS自带的FTP如何创建,就算创建了也不会实现多用户,下面我来分享一下我的经验吧: 使用 IIS 设置 FTP 服务器 依次单击“开始”按钮.“控制面板”和“添加或删除程序” ...
- hdu5137 枚举删点
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; ; ; ...
- 生成主键ID,唯一键id,分布式ID生成器雪花算法代码实现
工具类: package com.ihrm.common.utils; import java.lang.management.ManagementFactory; import java.net. ...
- win10下Anaconda3配置环境变量
有时候在win10安装好Anaconda3后,使用conda命令时依然会出现: C:\Users\dell\PycharmProjects\pytorch>conda list 'conda' ...
- Java中try catch finally语句中含return语句的执行情况总结-编程陷阱
前言:有java编程基础的人对java的异常处理机制都会有一定了解,而且可能感觉使用起来也比较简单,但如果在try catch finally语句块中遇到return语句,开发者可能就会遇到一些逻辑问 ...
- spider csdn blog part II
继续上次的笔记, 继续完善csdn博文的提取. 发现了非常好的模块. html2docx 结果展示: 运行之后, 直接生成docx文档. 截个图如下: 结果已经基本满意了!!! 在编写过程中的一些感想 ...
- 强制去除xcode的编译警告
使用 #pragma clang diagnostic ignored 语法来强制去除xcode的编译警告,代码举例如下: #pragma clang diagnostic push #pragma ...
- WPF Canvas实现进度条
原文:WPF Canvas实现进度条 先看效果图: 思路: 一个Canvas做背景,一个Canvas用来显示进度,图片放在显示进度的Canvas中,靠右设置为图片本身宽度一半的距离,视觉上实现以图片中 ...