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

题意: 第一行输入一个 t 表 t 组输入, 对于每组输入: 第一行  n 表接下来有 n 行形如 l, r 的输入, 表在区间 [l, r] 贴一张海报, 问最终能看见几张不同的海报;

思路: 线段树区间替换, 每次 update 时都会给对应区间加一个 lazy 标记, 最终统计标记的种数即为答案;

注意: 题目给出的 l, r 很大, 需要离散化, 和普通的离散化不同, 因为本题中每个单位是代表长度为一的一个区间,而非一个点, 所以对于两个数 a, b, 若 b > a + 1,

hash[a] = cnt, 那么hash[b] = cnt + 2 而非 hahs[b] = cnt + 1;不然对于一些数据会出错.

代码:

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <algorithm>
  4. #include <string.h>
  5. #include <map>
  6. #define lson l, mid, rt << 1
  7. #define rson mid + 1, r, rt << 1 | 1
  8. using namespace std;
  9.  
  10. const int MAXN = 1e4 + ;
  11. int l[MAXN], r[MAXN], gel[MAXN << ], lazy[MAXN << ];
  12. bool vis[MAXN << ];
  13. map<int, int> hash;
  14. int ans;
  15.  
  16. void push_down(int rt){//将当前标记向下一层更新
  17. if(lazy[rt] != -){
  18. lazy[rt << ] = lazy[rt << | ] = lazy[rt];
  19. lazy[rt] = -;
  20. }
  21. }
  22.  
  23. void update(int L, int R, int x, int l, int r, int rt){//区间替换
  24. if(L <= l && R >= r){
  25. lazy[rt] = x;
  26. return;
  27. }
  28. push_down(rt);
  29. int mid = (l + r) >> ;
  30. if(L <= mid) update(L, R, x, lson);
  31. if(R > mid) update(L, R, x, rson);
  32. }
  33.  
  34. void query(int l, int r, int rt){
  35. if(lazy[rt] != -){//标记的种数即为答案
  36. if(!vis[lazy[rt]]){
  37. ans++;
  38. vis[lazy[rt]] = true;
  39. }
  40. return;
  41. }
  42. if(l == r) return;
  43. int mid = (l + r) >> ;
  44. query(lson);
  45. query(rson);
  46. }
  47.  
  48. int main(void){
  49. int t, n;
  50. scanf("%d", &t);
  51. while(t--){
  52. int indx = , cnt = ;
  53. scanf("%d", &n);
  54. for(int i = ; i < n; i++){
  55. scanf("%d%d", &l[i], &r[i]);
  56. gel[indx++] = l[i];
  57. gel[indx++] = r[i];
  58. }
  59. sort(gel, gel + indx);
  60. hash[gel[]] = cnt;
  61. for(int i = ; i < indx; i++){ //hash
  62. if(gel[i] > gel[i - ] + ){
  63. cnt += ;
  64. hash[gel[i]] = cnt;
  65. }else if(gel[i] > gel[i - ]){
  66. cnt += ;
  67. hash[gel[i]] = cnt;
  68. }
  69. }
  70. memset(lazy, -, sizeof(lazy));
  71. memset(vis, false, sizeof(vis));
  72. for(int i = ; i < n; i++){
  73. update(hash[l[i]], hash[r[i]], i, , cnt, );
  74. }
  75. ans = ;
  76. query(, cnt, );
  77. printf("%d\n", ans);
  78. }
  79. return ;
  80. }

poj2528(线段树区间替换&离散化)的更多相关文章

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

    题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...

  2. HDU 1698 Just a Hook(线段树 区间替换)

    Just a Hook [题目链接]Just a Hook [题目类型]线段树 区间替换 &题解: 线段树 区间替换 和区间求和 模板题 只不过不需要查询 题里只问了全部区间的和,所以seg[ ...

  3. HDU.1689 Just a Hook (线段树 区间替换 区间总和)

    HDU.1689 Just a Hook (线段树 区间替换 区间总和) 题意分析 一开始叶子节点均为1,操作为将[L,R]区间全部替换成C,求总区间[1,N]和 线段树维护区间和 . 建树的时候初始 ...

  4. hdu1698(线段树区间替换模板)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1698 题意: 第一行输入 t 表 t 组测试数据, 对于每组测试数据, 第一行输入一个 n , 表示 ...

  5. POJ2528:Mayor's posters(线段树区间更新+离散化)

    Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...

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

    http://poj.org/problem?id=2528 https://www.luogu.org/problem/UVA10587 Description The citizens of By ...

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

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

  8. poj 2528 线段树区间修改+离散化

    Mayor's posters POJ 2528 传送门 线段树区间修改加离散化 #include <cstdio> #include <iostream> #include ...

  9. POJ 2528——Mayor's posters——————【线段树区间替换、找存在的不同区间】

    Mayor's posters Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Sub ...

随机推荐

  1. linux rsyncserver文件同步

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zqtsx/article/details/24254651 [root@zqtsx]# rpm -q ...

  2. 使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器

    参考: 1,使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(一)http://blog.csdn.net/xdwyyan/article/details/4319 ...

  3. Quartz Job scheduling 基础实现代码

    Quartz 集成在 SpringBoot 中分为 config.task.utils.controller 和 MVC 的三层即 controller.service.dao 和 entity. c ...

  4. linux下安装https证书

    https://www.aliyun.com/jiaocheng/165422.html

  5. hihocoder #1040 矩形判断(计算几何问题 给8个点的坐标,能否成为一个矩形 【模板思路】)

    #1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入第一行是一个整数T ...

  6. .net 常用的插件列表

    1,.net 分布式Session 解决方案RedisSessionStateProvider 2,c# 表达式树查看工具 Expression Tree Visualizer 3,sqlbuilde ...

  7. MySQL Unable to convert MySQL date/time value to System.DateTime的解决办法

    在连接串中加入 Convert Zero Datetime=True

  8. Sturs2 -概念讲解 第一弹

    源码下载地址:http://struts.apache.org/ struts-2.5.14.1-all.zip --所有内容 struts-2.5.14.1-apps.zip  --实例的应用 st ...

  9. DBA日记:一次reboot导致的严重失误

    昨天下午,一现场要添加RAC节点,db1节点正常运行,添加db2节点:在db2上做了安装的一些配置后,需要reboot, 于是直接就reboot:糟糕,这条命令错误地执行在db1上了,导致现场数据库直 ...

  10. hdu 6121 Build a tree

    /** * 题意:一棵 n 个点的完全 k 叉树,结点标号从 0 到 n - 1,求以每一棵子树的大小的异或和. * 解法:k叉树,当k=1时,特判,用xorn函数,具体解释:http://blog. ...