本题就是要往墙上贴海报,问最后有多少可见的海报。

事实上本题的难点并非线段树,而是离散化。

由于数据非常大,直接按原始数据计算那么就会爆内存和时间的。

故此须要把数据离散化。

比方有海报1 6   7 9   20 100  5 1000的原始数据。直接计算须要1-1000的内存,离散化之后仅仅须要8内存,由于仅仅有4组数据8个数。

本题更进一步高级一点的离散化就是须要把不相邻的两个数据插入一个数值。表示有空白的地方,不是全部海报都覆盖到的。

比方上面的数据要离散为:1 2  5 6  7 8 9 10 20 21 100 101 1000,中间插入了一些数值,这样才干保证数据正确。

比較难想出来的地方。须要好好考虑一下才干想通的。

看程序discreteArr是离散化之后的数据。使用这种数据处理就能够比原始数据少非常多数据了。

  1. #include <stdio.h>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int SIZE = 10005;
  6. bool hashColor[SIZE];
  7. int le[SIZE], ri[SIZE];
  8. int discreteArr[SIZE<<2];//由于这里或许须要四倍的SIZE内存
  9. int seg[SIZE<<4];
  10. int visiblePosts;
  11.  
  12. inline int lChild(int rt) { return rt<<1; }
  13. inline int rChild(int rt) { return rt<<1|1; }
  14.  
  15. inline void pushDown(int rt)
  16. {
  17. if (seg[rt])
  18. {
  19. seg[lChild(rt)] = seg[rChild(rt)] = seg[rt];
  20. seg[rt] = 0;
  21. }
  22. }
  23.  
  24. void build(int l, int r, int rt)
  25. {
  26. seg[rt] = 0;
  27. if (l == r) return ;
  28. int m = l + ((r-l)>>1);
  29. build(l, m, lChild(rt));
  30. build(m+1, r, rChild(rt));
  31. }
  32.  
  33. void update(int ql, int qr, int col, int l, int r, int rt)
  34. {
  35. if (ql <= l && r <= qr)
  36. {
  37. seg[rt] = col;
  38. return;
  39. }
  40. pushDown(rt);
  41. int m = l + ((r-l)>>1);
  42. if (ql <= m) update(ql, qr, col, l, m, lChild(rt));
  43. if (m < qr) update(ql, qr, col, m+1, r, rChild(rt));
  44. }
  45.  
  46. void query(int l, int r, int rt)
  47. {
  48. if (seg[rt])
  49. {
  50. if (!hashColor[seg[rt]])
  51. {
  52. visiblePosts++;
  53. hashColor[seg[rt]] = true;
  54. }
  55. return ;
  56. }
  57. if (l == r) return ;//注意这里没有poster的时候
  58. int m = l + ((r-l)>>1);
  59. query(l, m, lChild(rt));
  60. query(m+1, r, rChild(rt));
  61. }
  62.  
  63. int biSearch(int arr[], int key, int n)
  64. {
  65. int l = 1, r = n-1, m = -1;
  66. while (l <= r)
  67. {
  68. m = l + ((r-l)>>1);
  69. if (arr[m] < key) l = m+1;
  70. else if (key < arr[m]) r = m-1;
  71. else break;
  72. }
  73. return m;
  74. }
  75.  
  76. int main()
  77. {
  78. int T, n;
  79. scanf("%d", &T);
  80. while (T--)
  81. {
  82. scanf("%d", &n);
  83. int disN = 1;
  84. for (int i = 1; i <= n; i++)
  85. {
  86. scanf("%d %d", &le[i], &ri[i]);
  87. discreteArr[disN++] = le[i];
  88. discreteArr[disN++] = ri[i];
  89. }
  90. sort(discreteArr+1, discreteArr+disN);
  91.  
  92. int j = 2;
  93. for (int i = 2; i < disN; i++)
  94. {
  95. if (discreteArr[i] != discreteArr[i-1])
  96. discreteArr[j++] = discreteArr[i];
  97. }
  98. for (int i = j-1; i > 1; i--)
  99. {
  100. if (discreteArr[i] != discreteArr[i-1] + 1)
  101. discreteArr[j++] = discreteArr[i-1] + 1;
  102. }
  103. sort(discreteArr + 1, discreteArr + j);
  104. build(1, j-1, 1);
  105. for (int i = 1; i <= n; i++)
  106. {
  107. int ql = biSearch(discreteArr, le[i], j);
  108. int qr = biSearch(discreteArr, ri[i], j);
  109. update(ql, qr, i, 1, j-1, 1);
  110. }
  111. visiblePosts = 0;
  112. memset(hashColor, 0, sizeof(bool) * (n+1));
  113. query(1, j-1, 1);
  114. printf("%d\n", visiblePosts);
  115. }
  116. return 0;
  117. }

POJ 2528 Mayor&#39;s posters 离散化和线段树题解的更多相关文章

  1. POJ 2528 Mayor&#39;s posters 离散化+线段树

    题目大意:给出一些海报和贴在墙上的区间.问这些海报依照顺序贴完之后,最后能后看到多少种海报. 思路:区间的范围太大,然而最多仅仅会有10000张海报,所以要离散化. 之后用线段树随便搞搞就能过. 关键 ...

  2. poj 2528 Mayor&#39;s posters 【线段树 + 离散化】

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

  3. 线段树区间更新,区间统计+离散化 POJ 2528 Mayor&#39;s posters

    题意:有一个非常长的板子(10000000长),在上面贴n(n<=10000)张海报.问最后从外面能看到几张不同的海报. 由于板子有10000000长,直接建树肯定会爆,所以须要离散化处理,对于 ...

  4. poj 2528 Mayor&#39;s posters

    这个题意是市长竞选,然后每一个人都能够贴广告牌.能够覆盖别人的看最后剩几个广告牌 这题目想了两个多小时,最后忍不住看了一下题解. 发现仅仅是简单地hash  和线段树成段更新 由于有10000个人竞选 ...

  5. POJ-2528 Mayor's posters (离散化, 线段树)

    题目传送门: POJ-2528 题意就是在一个高度固定的墙面上贴高度相同宽度不同的海报,问贴到最后还能看到几张?本质上是线段树区间更新问题,但是要注意的是题中所给数据范围庞大,直接搞肯定会搞出问题,所 ...

  6. POJ 2482 Stars in Your Window 离散化+扫描法 线段树应用

    遇见poj上最浪漫的题目..题目里图片以上几百词为一篇模板级英文情书.这情感和细腻的文笔深深地打动了我..不会写情书的童鞋速度进来学习.传送门 题意:坐标系内有n个星星,每个星星都有一个亮度c (1& ...

  7. poj 2528 Mayor's posters(线段树+离散化)

    /* poj 2528 Mayor's posters 线段树 + 离散化 离散化的理解: 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用线段树求解的话,很明显 ...

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

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

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

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

随机推荐

  1. java类的属性

    类的嵌套!!!!!!!!!! 首先我们创建一个学生卡卡号的一个类,这个类有两个属性,校园卡号和银行卡号 package cuteSnow; public class StudentCard { pub ...

  2. word上怎么打钩

    原文:http://www.wordlm.com/html/2291.html 有时我们在Word中制作一份特殊的表格时,可能会用到这样一些特殊符号,“在方框里打钩”或打叉.这些符号虽看起来简单不起眼 ...

  3. [terry笔记]python内置函数

    总结一下内置函数,Build-in Function. 一.数学运算类 abs(x) 求绝对值 complex([real[, imag]]) 创建一个复数 divmod(a, b) 分别取商和余数注 ...

  4. 洛谷 P3133 [USACO16JAN]无线电联系Radio Contact

    P3133 [USACO16JAN]无线电联系Radio Contact 题目描述 Farmer John has lost his favorite cow bell, and Bessie the ...

  5. 在JAVA中将class文件编译成jar文件包,运行提示没有主清单属性

    在JAVA中将class文件编译成jar文件包,运行提示没有主清单属性 Maven 项目生成jar运行时提示“没有主清单属性” 新建了一个Maven的项目,mvn compile和mvn packag ...

  6. 将maven中央仓库不存在的jar包添加到本地仓库

    这里有2个案例,需要手动发出Maven命令包括一个 jar 到 Maven 的本地资源库. 要使用的 jar 不存在于 Maven 的中心储存库中. 您创建了一个自定义的 jar ,而另一个 Mave ...

  7. HDU 4329 Contest 3

    果然换个编译器就过了.总的来说,不难,不过就是处理一些空格.学习了一个新的类 istringstream可以按空格划分.然后,那条式子要理解. 式子的意义是: 找到一个串,该串在query中是第几个找 ...

  8. SPOJ 4491

    不妨先把所有要求的素数的对的个数写出来 f(2)=u(1)G(2)+u(2)*G(2*2)+u(3)*G(2*3)+.....u(k2)*G(2*k2) f(3)=u(1)G(3)+u(2)*G(2* ...

  9. [HTML5] Inlining images with SVG and data URIs

    The main reason you want to do I"nlining images with SVG and data URIs" is to reduce http ...

  10. Android UI布局之TableLayout

    从字面上了解TableLayout是一种表格式的布局.这样的布局会把包括的元素以行和列的形式进行排列.表格的列数为每一行的最大列数.当然表格里边的单元格是能够为空的. 实例:LayoutDemo 执行 ...