题目链接:http://poj.org/problem?id=2528

题目大意:有一个很上的面板, 往上面贴海报, 问最后最多有多少个海报没有被完全覆盖

解题思路:将贴海报倒着想, 对于每一张海报只需要判断他要贴的位置是否已经全部被之前的海报覆盖就可以了, 如果没有被覆盖那么这个海报最后是没有被完全覆盖的, 如果被覆盖了, 那么最后是被完全覆盖的。标准的线段树题目.

代码如下:

  1. #include<stdio.h>
  2. #include<vector>
  3. #include<map>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N = ;
  7.  
  8. pair<int, int>edge[N];
  9. vector<int> vec;
  10. map<int, int> mp;
  11.  
  12. struct SegmentTree
  13. {
  14. int l, r;
  15. bool mk;
  16. bool lazy;
  17. };
  18.  
  19. SegmentTree tree[N << ];
  20.  
  21. void build(int l, int r, int k)
  22. {
  23. tree[k].l = l, tree[k].r = r, tree[k].mk = false, tree[k].lazy = false;
  24. if(l== r)
  25. return;
  26. int mid = (l + r) >> ;
  27. build(l, mid, k<<);
  28. build(mid+, r, k<<|);
  29. }
  30.  
  31. bool query(int l, int r, int k)
  32. {
  33. if(tree[k].mk)
  34. return true;
  35.  
  36. if(tree[k].l >= l && tree[k].r <= r)
  37. return tree[k].mk;
  38.  
  39. bool a = true, b = true;
  40. if(tree[k<<].r >= l)
  41. a = query(l, r, k<<);
  42. if(tree[k<<|].l <= r)
  43. b = query(l, r, k<<|);
  44. return (a && b);
  45. }
  46.  
  47. void updata(int l, int r, int k)
  48. {
  49. if(tree[k].l >= l && tree[k].r <= r)
  50. {
  51. tree[k].mk = true;
  52. tree[k].lazy = true;
  53. return;
  54. }
  55.  
  56. if(tree[k].lazy)
  57. {
  58. tree[k<<].lazy = tree[k<<|].lazy = true;
  59. tree[k].lazy = false;
  60. tree[k<<].mk = tree[k<<|].mk = true;
  61. }
  62. if(tree[k<<].r >= l)
  63. updata(l, r, k<<);
  64. if(tree[k<<|].l <= r)
  65. updata(l, r, k<<|);
  66.  
  67. tree[k].mk = (tree[k<<].mk && tree[k<<|].mk);
  68. }
  69.  
  70. void solve()
  71. {
  72. int n;
  73. scanf("%d", &n);
  74. vec.clear();
  75. for(int i=; i<n; ++ i)
  76. {
  77. scanf("%d%d", &edge[i].first, &edge[i].second);
  78. vec.push_back(edge[i].first);
  79. vec.push_back(edge[i].second);
  80. }
  81.  
  82. sort(vec.begin(), vec.end());
  83. vec.erase(unique(vec.begin(), vec.end()), vec.end());
  84.  
  85. mp.clear();
  86. int s = ;
  87. for(int i=; i<vec.size(); ++ i)
  88. {
  89. mp[vec[i]] = s;
  90. if(i != vec.size() - )
  91. {
  92. if(vec[i+] == vec[i] + )
  93. s ++;
  94. else
  95. s += ;
  96. }
  97. }
  98.  
  99. build(, s, );
  100.  
  101. int ans = ;
  102. for(int i=n-; i>=; -- i)
  103. {
  104. int l = mp[edge[i].first], r = mp[edge[i].second];
  105. if(query(l, r, ) == false)
  106. {
  107. ans ++;
  108. updata(l, r, );
  109. }
  110. }
  111. printf("%d\n", ans);
  112. }
  113.  
  114. int main()
  115. {
  116. int t;
  117. scanf("%d", &t);
  118. while(t --)
  119. solve();
  120. return ;
  121. }

POJ 2528 Mayor's posters (线段树)的更多相关文章

  1. POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)

    POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...

  2. poj 2528 Mayor's posters 线段树+离散化技巧

    poj 2528 Mayor's posters 题目链接: http://poj.org/problem?id=2528 思路: 线段树+离散化技巧(这里的离散化需要注意一下啊,题目数据弱看不出来) ...

  3. poj 2528 Mayor's posters 线段树区间更新

    Mayor's posters Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=2528 Descript ...

  4. POJ 2528 Mayor's posters(线段树+离散化)

    Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...

  5. poj 2528 Mayor's posters 线段树+离散化 || hihocode #1079 离散化

    Mayor's posters Description The citizens of Bytetown, AB, could not stand that the candidates in the ...

  6. poj 2528 Mayor's posters(线段树)

    题目:http://poj.org/problem?id=2528 题意:有一面墙,被等分为1QW份,一份的宽度为一个单位宽度.现在往墙上贴N张海报,每张海报的宽度是任意的, 但是必定是单位宽度的整数 ...

  7. POJ 2528 Mayor's posters (线段树区间更新+离散化)

    题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...

  8. POJ 2528 Mayor's posters (线段树+离散化)

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:75394   Accepted: 21747 ...

  9. POJ 2528 Mayor’s posters (线段树段替换 && 离散化)

    题意 : 在墙上贴海报, n(n<=10000)个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000).求出最后还能看见多少张海报. 分析 ...

随机推荐

  1. C连接MySQL数据库开发之Windows环境配置及测试(转)

    http://blog.csdn.net/xyang81/article/details/26814633(转)

  2. 将jquery.shCircleLoader插件修改为zepto.js兼容

    经过查阅资料zepto 和 jquery 的区别后发现是 (1)zepto.js  删去了 jquery 的 innerHeight() 和 innerWidth() 属性  (2)zepto.js和 ...

  3. 二模15day1解题报告

    T1.合并序列(minval) 给出长为 n的AB两个序列求两两相加中最小的n个. 据说有证明(在蓝书上,优先队列部分)先把A[1~n]+b[1]入队,然后每取一个a[x]+b[y]就把a[x]+b[ ...

  4. js 中文乱码解决方法

     bookManageAdd: function () {         top.MainFrameJS.confirm = true;         var action = getQueryS ...

  5. Broadcom以太网交换芯片培训

      目录 1.交换芯片架构....................................................................................... ...

  6. Hex string convert to Binary String and Vise-Versa(16进制和2进制字符串的相互转换)

    这个转换在我们日常的编码中还是很有机会遇到的,这里贴出来和大家分享探讨. void pu_hex_to_binary(std::string strHex, std::string &strB ...

  7. mysql快速导入大量数据问题

    今天需要把将近存有一千万条记录的*.sql导入到mysql中.使用navicate导入,在导入100万条之后速度就明显变慢了, 导入五百万条数据的时候用了14个小时,且后面的数据导入的越来越慢. 后来 ...

  8. 解除破解正版Kindle电子书籍的版权限制

    解除破解正版Kindle电子书籍的版权限制(DRM). 方法并不复杂: 安装好Calibre电子书籍阅读管理软件: 在Calibre软件中安装好破解DRM插件:DRM: 把购买到的Kindle电子书籍 ...

  9. ipv6过审函数

    int _ResolveIPv4Address(const char* ipv4_str, char* buffer, int bufferSize) { struct addrinfo hints, ...

  10. No permission to write APN settings: Neither user *** nor current process has android.permission.WRITE_APN_SETTINGS.

    在ICS40以前的版本中,如果程序需要设置APN,只需要在AndroidManifest文件中声明这个权限即可.在40的机器上运行则会抛出以下异常:java.lang.SecurityExceptio ...