题意:给定一棵树的公司职员管理图,有两种操作,

第一种是 T x y,把 x 及员工都变成 y,

第二种是 C x 询问 x 当前的数。

析:先把该树用dfs遍历,形成一个序列,然后再用线段树进行维护,很简单的线段树。

代码如下:

  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include <cstdio>
  3. #include <string>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <iostream>
  7. #include <cstring>
  8. #include <set>
  9. #include <queue>
  10. #include <algorithm>
  11. #include <vector>
  12. #include <map>
  13. #include <cctype>
  14. #include <cmath>
  15. #include <stack>
  16. #include <sstream>
  17. #define debug() puts("++++");
  18. #define gcd(a, b) __gcd(a, b)
  19. #define lson l,m,rt<<1
  20. #define rson m+1,r,rt<<1|1
  21. #define freopenr freopen("in.txt", "r", stdin)
  22. #define freopenw freopen("out.txt", "w", stdout)
  23. using namespace std;
  24.  
  25. typedef long long LL;
  26. typedef unsigned long long ULL;
  27. typedef pair<int, int> P;
  28. const int INF = 0x3f3f3f3f;
  29. const LL LNF = 1e17;
  30. const double inf = 0x3f3f3f3f3f3f;
  31. const double PI = acos(-1.0);
  32. const double eps = 1e-8;
  33. const int maxn = 5e4 + 10;
  34. const int mod = 1000000007;
  35. const int dr[] = {-1, 0, 1, 0};
  36. const int dc[] = {0, 1, 0, -1};
  37. const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
  38. int n, m;
  39. const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  40. const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  41. inline bool is_in(int r, int c){
  42. return r >= 0 && r < n && c >= 0 && c < m;
  43. }
  44.  
  45. vector<int> G[maxn];
  46. int in[maxn], out[maxn];
  47. int cnt;
  48. int sum[maxn<<2], setv[maxn<<2];
  49.  
  50. void dfs(int u){
  51. in[u] = ++cnt;
  52. for(int i = 0; i < G[u].size(); ++i)
  53. dfs(G[u][i]);
  54. out[u] = cnt;
  55. }
  56.  
  57. void push_down(int rt){
  58. if(setv[rt] == -1) return ;
  59. int l = rt<<1, r = rt<<1|1;
  60. sum[l] = sum[r] = setv[rt];
  61. setv[l] = setv[r] = setv[rt];
  62. setv[rt] = -1;
  63. }
  64.  
  65. void update(int L, int R, int val, int l, int r, int rt){
  66. if(L <= l && r <= R){
  67. sum[rt] = val;
  68. setv[rt] = val;
  69. return ;
  70. }
  71. push_down(rt);
  72. int m = l + r >> 1;
  73. if(L <= m) update(L, R, val, lson);
  74. if(R > m) update(L, R, val, rson);
  75. }
  76.  
  77. int query(int M, int l, int r, int rt){
  78. if(l == r) return sum[rt];
  79. push_down(rt);
  80. int m = l + r >> 1;
  81. return M <= m ? query(M, lson) : query(M, rson);
  82. }
  83.  
  84. int main(){
  85. int T; cin >> T;
  86. for(int kase = 1; kase <= T; ++kase){
  87. scanf("%d", &n);
  88. for(int i = 1; i <= n; ++i) G[i].clear();
  89. memset(in, 0, sizeof in);
  90. for(int i = 1; i < n; ++i){
  91. int u, v;
  92. scanf("%d %d", &u, &v);
  93. G[v].push_back(u);
  94. ++in[u];
  95. }
  96. cnt = 0;
  97. for(int i = 1; i <= n; ++i)
  98. if(!in[i]){ dfs(i); break; }
  99. memset(setv, -1, sizeof setv);
  100. memset(sum, -1, sizeof sum);
  101.  
  102. scanf("%d", &m);
  103. char s[5];
  104. printf("Case #%d:\n", kase);
  105. while(m--){
  106. int x, y;
  107. scanf("%s %d", s, &x);
  108. if(s[0] == 'C') printf("%d\n", query(in[x], 1, n, 1));
  109. else {
  110. scanf("%d", &y);
  111. update(in[x], out[x], y, 1, n, 1);
  112. }
  113. }
  114. }
  115. return 0;
  116. }

  

HDU 3974 Assign the task (DFS+线段树)的更多相关文章

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

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

  2. hdu 3974 Assign the task(线段树)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3974 题意:给定一棵树,50000个节点,50000个操作,C x表示查询x节点的值,T x y表示更 ...

  3. HDU - 3974 Assign the task (线段树区间修改+构建模型)

    https://cn.vjudge.net/problem/HDU-3974 题意 有一棵树,给一个结点分配任务时,其子树的所有结点都能接受到此任务.有两个操作,C x表示查询x结点此时任务编号,T ...

  4. hdu 3974 Assign the task (线段树+树的遍历)

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

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

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

  6. 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 ...

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

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

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

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

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

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

随机推荐

  1. poj2010

    大学招n(n为奇数)个牛 招第i个牛需要ai块钱 第i个牛高考si分 输入招的牛数n 总的牛数c 总的钱数f 以及ai si 问用这些钱招的n个牛高考分数的中位数最大是多少 如果钱不够输出-1 这题结 ...

  2. BZOJ- 2733: 永无乡 (并查集&线段树合并)

    题意:给定N个节点,K次操作,操作有两种,1是合并两个集合,2是求某个集合的第K大(从小到大排序). 思路:合并只要启发式即可.此题可以用线段树,保存1到N的排序的出现次数和. 复杂度O(NlogN) ...

  3. 1110. Complete Binary Tree (25)

    Given a tree, you are supposed to tell if it is a complete binary tree. Input Specification: Each in ...

  4. 六、python沉淀之路--int str list tuple dict 重点总结

    一.数字int(..)二.字符串replace/find/join/strip/startswith/split/upper/lower/formattempalte = "i am {na ...

  5. VS中添加自定义代码片段

    前言 用#4敲出 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; int main(voi ...

  6. python list和元祖

    一,元祖 在python中元祖是只能查询和读取的一组数据,在()内的赋值就是元祖,只有查询和读取的功能: 1.len()方法:查询元祖有多少个元素 s = (') print(len(s)) 结果: ...

  7. Python collections系列之双向队列

    双向队列(deque) 一个线程安全的双向队列 1.创建一个双向队列 import collections d = collections.deque() d.append(') d.appendle ...

  8. ZOJ 4016 Mergeable Stack(栈的数组实现)

    Mergeable Stack Time Limit: 2 Seconds      Memory Limit: 65536 KB Given  initially empty stacks, the ...

  9. form表单提交target属性使用

    通过form表单提交刷新iframe <form action="doctor/selPackage" target="projectlistframe" ...

  10. Java更新

    Java I/O 总结 JVM(8):JVM知识点总览-高级Java工程师面试必备 细数JDK里的设计模式 Java中创建对象的5种不同方法 关于Java Collections的几个常见问题 类在什 ...