[关闭]
@2017libin 2019-06-16T16:54:53.000000Z 字数 1624 阅读 53

线段树

acm


  1. # include<iostream>
  2. # include<string>
  3. # include<algorithm>
  4. #include<numeric>
  5. #include <vector>
  6. #include <queue>
  7. using namespace std;
  8. int countColors[40] = { 0 };
  9. // 创建一个树的节点数组
  10. struct Node {
  11. int l, r;
  12. int flag;
  13. }tree[1000000];
  14. //建树
  15. void BuildTree(int node, int start, int end) {
  16. int mid = (end + start) / 2;
  17. tree[node].l = start;
  18. tree[node].r = end;
  19. tree[node].flag = 1; // 初始化颜色为1
  20. if (start != end) { // 如果不是节点,递归建树
  21. BuildTree(2 * node, start, mid);
  22. BuildTree(2 * node + 1, mid + 1, end);
  23. }
  24. }
  25. //对区间[start, end]进行染色
  26. void colorTree(int node, int start, int end, int color) {
  27. int mid = (tree[node].l + tree[node].r) / 2; // 左右节点区间为[start, mid]和[mid+1, end]
  28. if (tree[node].l >= start && tree[node].r <= end) //染色区间包含整个节点区间
  29. tree[node].flag = color;
  30. else
  31. {
  32. //if (tree[node].flag != 0) //对左右节点区间的color初始化?
  33. //tree[2 * node].flag = tree[2 * node + 1].flag = tree[node].flag;
  34. if (start <= mid)
  35. colorTree(2 * node, start, end, color);
  36. if (end > mid)
  37. colorTree(2 * node + 1, start, end, color);
  38. if (tree[2 * node].flag == tree[2 * node + 1].flag) //染色完之后对根节点区间color重新赋值
  39. tree[node].flag = tree[2 * node].flag;
  40. else
  41. tree[node].flag = 0;
  42. }
  43. }
  44. // 对区间[start, end]进行查询
  45. void que(int node, int start, int end) {
  46. int mid = (tree[node].l + tree[node].r) / 2;
  47. if (tree[node].flag != 0)
  48. countColors[tree[node].flag] = 1;
  49. else
  50. {
  51. if (start <= mid)
  52. que(2 * node, start, end);
  53. if (end > mid)
  54. que(2 * node + 1, start, end);
  55. //if (tree[2 * node].flag == tree[2 * node + 1].flag) //有啥用?
  56. //tree[node].flag = tree[2 * node].flag;
  57. //else
  58. //tree[node].flag = 0;
  59. }
  60. }
  61. int main() {
  62. //输入节点数,颜色数量,操作次数
  63. int L, T, o;
  64. int a, b, c;
  65. char x;
  66. cin >> L >> T >> o;
  67. BuildTree(1, 1, L);
  68. for (int i = 0; i < o; i++) {
  69. cin >> x;
  70. // 区间染色
  71. if (x == 'C') {
  72. cin >> a >> b >> c;
  73. colorTree(1, a, b, c);
  74. }
  75. // 区间颜色查询
  76. if (x == 'P') {
  77. cin >> a >> b;
  78. memset(countColors, 0, sizeof(countColors));
  79. que(1, a, b);
  80. int ans = 0;
  81. for (int j = 1; j <= T; j++)
  82. if (countColors[j] != 0)ans++;
  83. cout << ans << endl;
  84. }
  85. }
  86. system("pause");
  87. return 0;
  88. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注