题目大意

贴海报。每张海报的高度都是一样的,唯独宽度不一样。每张海报只能占用整数倍的单位线段长度,贴了 n(n<=10000) 张海报之后,有几张能够看见(有一个角能看见这张海报也算被看见了)?海报的宽度最大可以达到 10^7

做法分析

一看就是线段树

先不考虑线段的长度能够达到 10^7

肯定是给每张海报一个颜色,然后在这张海报能够占领的区间中涂上这个颜色。每次更新的时候就直接区间操作,记得使用懒操作

最后统计颜色就行了,统计颜色的时候用一个辅助数组,记录这个颜色是否出现过

最后就是处理线段的长度了,显然离散化

但是这里有一个小问题:题目所给的区间,例如是 [2, 4] ,表示的是 第 2 个到第 4 个长度为 1 的小区间。我们这里不能直接根据数的大小离散化

排序后,假设当前数是 x,如果 x-1 出现过,那么 x 离散化后应该是 x-1 的标记 +1,否则应该是上一个的标记 +2

参考代码

POJ 2528

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <iostream>
  4 #include <algorithm>
  5 #include <map>
  6 #include <vector>
  7
  8 using namespace std;
  9
 10 const int N=20006;
 11
 12 int ans;
 13 bool vs[N];
 14
 15 struct interval_tree
 16 {
 17     struct data
 18     {
 19         int st, en, color;
 20         data() {}
 21         data(int a, int b, int c)
 22         {
 23             st=a, en=b, color=c;
 24         }
 25     }T[N<<3];
 26
 27     void build(int id, int L, int R)
 28     {
 29         T[id]=data(L, R, 0);
 30         if(L==R) return;
 31         int mid=(L+R)>>1;
 32         build(id<<1, L, mid);
 33         build(id<<1|1, mid+1, R);
 34     }
 35
 36     inline void pushDown(int id)
 37     {
 38         T[id<<1].color=T[id<<1|1].color=T[id].color;
 39         T[id].color=0;
 40     }
 41
 42     void update(int id, int L, int R, int color)
 43     {
 44         if(L<=T[id].st && T[id].en<=R)
 45         {
 46             T[id].color=color;
 47             return;
 48         }
 49         if(T[id].color!=0) pushDown(id);
 50
 51         int mid=(T[id].st+T[id].en)>>1;
 52         if(R<=mid) update(id<<1, L, R, color);
 53         else if(L>mid) update(id<<1|1, L, R, color);
 54         else update(id<<1, L, R, color), update(id<<1|1, L, R, color);
 55     }
 56
 57     void query(int id)
 58     {
 59         if(T[id].color!=0 && !vs[T[id].color])
 60         {
 61             ans++, vs[T[id].color]=1;
 62             return;
 63         }
 64         if(T[id].st==T[id].en) return;
 65         if(T[id].color!=0) pushDown(id);
 66         query(id<<1), query(id<<1|1);
 67     }
 68 }tree;
 69
 70 vector <int> temp;
 71 map <int, int> ihash;
 72
 73 struct node
 74 {
 75     int L, R;
 76     node() {}
 77     node(int a, int b)
 78     {
 79         L=a, R=b;
 80     }
 81 }op[N];
 82 int n, t, tot;
 83
 84 int main()
 85 {
 86     scanf("%d", &t);
 87     for(int ca=1; ca<=t; ca++)
 88     {
 89         scanf("%d", &n);
 90         temp.clear(), ihash.clear(), tot=0;
 91         for(int i=0, a, b; i<n; i++)
 92         {
 93             scanf("%d%d", &a, &b);
 94             op[i]=node(a, b);
 95             temp.push_back(a), temp.push_back(b);
 96         }
 97         sort(temp.begin(), temp.end());
 98         for(int i=0; i<2*n; i++)
 99         {
100             int u=temp[i];
101             if(ihash.find(u)==ihash.end())
102             {
103                 if(ihash.find(u-1)==ihash.end())
104                     ihash.insert(make_pair(u, tot+1)), tot+=2;
105                 else
106                     ihash.insert(make_pair(u, tot)), tot++;
107             }
108         }
109
110         tree.build(1, 1, tot+2);
111         for(int i=0; i<n; i++)
112             tree.update(1, ihash[op[i].L], ihash[op[i].R], i+1);
113         for(int i=1; i<=n; i++) vs[i]=0;
114         ans=0;
115         tree.query(1);
116         printf("%d\n", ans);
117     }
118     return 0;
119 }

AC通道

POJ 2528 Mayor's posters

南洋理工 第 9 题 posters

转载于:https://www.cnblogs.com/zhj5chengfeng/archive/2013/03/26/2982737.html

POJ 2528 Mayor's posters(线段树)相关推荐

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

    /*离散化+线段树由于 数据的输入最大是 10000000 ,直接用开数组肯点会超,所以要将起离散话,首先 ,我们存储输入的边,将其离散化,后面的就和一般的线段树一样可. */#include< ...

  2. POJ - 2528 Mayor's posters(线段数+离散化)

    题目链接:点击查看 题目大意:给定一个长度为1e7的墙,然后给出n张海报,每张海报都会占据墙上的一部分宽度,问按照给出的次序往墙上贴海报, 最后有几张海报能露出来(露出部分也算) 题目分析:线段树的区 ...

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

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

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

    Mayor's posters https://vjudge.net/problem/POJ-2528#author=szdytom 线段树 + 离散化 讲解:https://blog.csdn.ne ...

  5. poj 2528 Mayor's posters(线段树 离散化 区间更新 贴海报)

         这个题目本来对大神来说可能是水题, 对我就不行了,昨晚非折腾到下半夜一点 搞定, 并且可以总结出 ,只有把问题想清楚,或着看人家解题报告自己把问题和代码思路 搞清楚,才能谈的上调bug,否则 ...

  6. POJ 2528 Mayor's posters (离散化和线段树使用)

    还是做了线段树的题目,玩了两天也要继续看看题目了.之前就有看离散化的概念,大家可以去百度百科一下,简单转载一个例子 离散化 的大概思路 : 比如说给你一组 数据 1 4 1000 100000, 如果 ...

  7. POJ 2528 Mayor's posters 贴海报 线段树 区间更新

    注意离散化!!!线段树的叶子结点代表的是一段!!! 给出下面两个简单的例子应该能体现普通离散化的缺陷: 1-10 1-4 5-10 1-10 1-4 6-10 普通离散化算出来的结果都会是2,但是第二 ...

  8. POJ - 2528 Mayor's posters (浮水法+线段树/离散化+线段树)

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

  9. POJ Mayor's posters——线段树+离散化

    原文:http://blog.163.com/cuiqiongjie@126/blog/static/85642734201261151553308/ 大致题意: 有一面墙,被等分为1QW份,一份的宽 ...

最新文章

  1. 3ds max 改变模型轴的坐标系位置
  2. 资源 | 《统计学习方法》的Python 3.6复现,实测可用
  3. 计算机网络智能化在铁路通信的发展,计算机网络在铁路信号中的应用
  4. springboot整合websocket实现一对一消息推送和广播消息推送
  5. 前端学习(2707):重读vue电商网站27之通过axios请求拦截器添加 token
  6. 【HDU - 4348】To the moon(主席树,区间更新)
  7. EasyNVR H5无插件摄像机直播解决方案前端解析之:videojs初始化的一些样式处理...
  8. centos6.5下postgresql9.4.3安装与配置
  9. c语言程序设计 江宝钏 实验九,c语言程序设计,江宝钏著,实验九
  10. .NET Remoting Basic(9)-上下文(CallContext)
  11. YASKAWA 安川变频器调试软件支持多种机型
  12. 场景文字检测——CTPN模型介绍及代码实现
  13. linux i350网卡,intel I350 网卡驱动安装方法
  14. 原创 | 最近程序员频繁被抓,如何避免面向监狱编程?!
  15. IDC评述网:2012年国外域名主机服务商TOP10
  16. app支付宝接入流程图_Android App支付系列(二):支付宝SDK接入详细指南(附官方支付demo)...
  17. flutter能开发游戏吗_Flutter Flame游戏开发上手(1)
  18. TI15.4STACK协议栈解读
  19. 规避Variable used in lambda expression should be final or effectively final而引发了方法参数值拷贝的问题
  20. wap实现手机充话费

热门文章

  1. OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3
  2. 2022-2028年中国乙酸钴行业发展现状调研及市场前景规划报告
  3. 2022-2028年中国纳滤膜产业发展态势及市场发展策略报告
  4. Git 常用操作(3)- 本地分之显示、创建、切换、合并和删除操作
  5. pip 将 某包指定到某目录 批量安装
  6. LeetCode简单题之猜数字大小
  7. Harmony生命周期
  8. YOLOV4各个创新功能模块技术分析(二)
  9. 2021年大数据Kafka(六):❤️安装Kafka-Eagle❤️
  10. 2021年大数据Hive(九):Hive的数据压缩