[关闭]
@Acqua 2018-12-21T02:52:56.000000Z 字数 1369 阅读 1064

HDU2528 Mayor's Posters(Dec. 20th, 2018)

线段树

题目来源

题意

给定张海报的张贴区间,按输入顺序覆盖在一面墙上,求最后能够看见的海报张数。

思路

——来自题解

1.离散化建树。,故答案不可能爆
2.区间标记下放。

代码

  1. // La Lune
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #define lson u << 1, l, mid
  7. #define rson u << 1 | 1, mid + 1, r
  8. #define N 100005
  9. using namespace std;
  10. struct lune{
  11. int s, id;
  12. } a[N << 1];
  13. int t[N << 2], vis[N];
  14. void build(int u, int l, int r){
  15. if(l == r) return;
  16. int mid = l + r >> 1;
  17. build(lson);
  18. build(rson);
  19. }
  20. void update(int u, int l, int r, int a, int b, int c){
  21. if(a <= l && r <= b){
  22. t[u] = c;
  23. return;
  24. }
  25. if(t[u]){
  26. t[u << 1] = t[u << 1 | 1] = t[u];
  27. t[u] = 0;
  28. }
  29. int mid = l + r >> 1;
  30. if(a <= mid)
  31. update(lson, a, b, c);
  32. if(b > mid)
  33. update(rson, a, b, c);
  34. }
  35. void query(int u, int l, int r){
  36. if(l == r && !t[u])
  37. return;
  38. if(t[u]){
  39. vis[t[u]] = 1;
  40. return;
  41. }
  42. if(t[u]){
  43. t[u << 1] = t[u << 1 | 1] = t[u];
  44. t[u] = 0;
  45. }
  46. int mid = l + r >> 1;
  47. query(lson);
  48. query(rson);
  49. }
  50. bool ctrl(lune x, lune y){
  51. return x. s < y. s;
  52. }
  53. int main(){
  54. int T, n, m;
  55. scanf("%d", &T);
  56. int b[N << 1];
  57. while(T--){
  58. scanf("%d", &m);
  59. memset(t, 0, sizeof(t));
  60. memset(vis, 0, sizeof(vis));
  61. int dm = m << 1;
  62. for(int i = 1; i <= dm; i += 2){
  63. scanf("%d %d", &b[i], &b[i + 1]);
  64. a[i] = (lune){b[i], i};
  65. a[i + 1] = (lune){b[i + 1], i + 1};
  66. }
  67. sort(a + 1, a + dm + 1, ctrl);
  68. for(int i = 1; i <= dm; i++){
  69. b[a[i]. id] = b[a[i - 1]. id] + 1;
  70. if(a[i]. s == a[i - 1]. s) b[a[i]. id]--;
  71. n = b[a[i]. id];
  72. }
  73. build(1, 1, n);
  74. for(int i = 1; i <= dm; i += 2)
  75. update(1, 1, n, b[i], b[i + 1], i / 2 + 1);
  76. query(1, 1, n);
  77. int ans = 0;
  78. for(int i = 1; i <= n; i++)
  79. ans += vis[i];
  80. printf("%d\n", ans);
  81. }
  82. return 0;
  83. }

反思

1.数组一定要开够。
2.用标准方式写码,不要随意骚操作。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注