POJ 2528 Mayor's posters 贴海报 线段树 区间更新
注意离散化!!!线段树的叶子结点代表的是一段!!!
给出下面两个简单的例子应该能体现普通离散化的缺陷:
1-10 1-4 5-10
1-10 1-4 6-10
普通离散化算出来的结果都会是2,但是第二组样例结果是3
如果相邻数字间距大于1的话,在其中加上任意一个数字,比如加成[1,2,3,6,7,10],然后再做线段树就好了.
线段树功能:update 成段更新,query 查询整个线段树
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 using namespace std;const int MAXN = 20010; int p[MAXN], mp[MAXN], pp[MAXN]; int pst[MAXN<<4], ans; bool flag[MAXN];bool cmp(int A, int B) {return p[A] < p[B]; }void push_down(int rt) {if(pst[rt] == 0) return;pst[rt<<1] = pst[rt<<1|1] = pst[rt];pst[rt] = 0; }void update(int L, int R, int c, int l, int r, int rt) {if(L <= l && r <= R){pst[rt] = c;return;}push_down(rt);int m = (l + r) >> 1;if(m >= L) update(L, R, c, lson);if(m < R) update(L, R, c, rson); }void query(int l, int r, int rt) {if(pst[rt] > 0) //只有大于0才有海报 {if(!flag[pst[rt]]) ans++;flag[pst[rt]] = 1;return;}if(l == r) return;push_down(rt);int m = (l + r) >> 1;query(lson);query(rson); }int main() { // freopen("in.txt", "r", stdin);int T, n;scanf("%d", &T);while(T--){scanf("%d", &n);for(int i=0; i<n; i++){scanf("%d%d", &p[i<<1], &p[i<<1|1]);mp[i<<1] = i<<1;mp[i<<1|1] = i<<1|1;}sort(mp, mp+2*n, cmp);pp[mp[0]] = 1;int N = 1;for(int i=1; i<2*n; i++) //离散化 {if(p[mp[i]] == p[mp[i-1]])pp[mp[i]] = N;else if(p[mp[i]] - p[mp[i-1]] > 1) //大于1的插一个数 {N += 2;pp[mp[i]] = N;}else pp[mp[i]] = ++N;}memset(pst, 0, sizeof(pst));for(int i=0; i<n; i++)update(pp[i<<1], pp[i<<1|1], i+1, 1, N, 1);memset(flag, 0, sizeof(flag));ans = 0;query(1, N, 1);printf("%d\n", ans);}return 0; }
转载于:https://www.cnblogs.com/pach/p/7442620.html
POJ 2528 Mayor's posters 贴海报 线段树 区间更新相关推荐
- POJ 2528 Mayor's posters (离散化和线段树使用)
还是做了线段树的题目,玩了两天也要继续看看题目了.之前就有看离散化的概念,大家可以去百度百科一下,简单转载一个例子 离散化 的大概思路 : 比如说给你一组 数据 1 4 1000 100000, 如果 ...
- POJ 3468 A Simple Problem with Integers(线段树区间更新)
题目链接 这个真费劲...其实我也不懂 为什么...大体思想是,如果把区间更新了,开始的时候只把用懒惰标记标记那个区间,而不更新底层元素,而如果查询的时候顺带着把lz标记给消除...多敲几遍,多调试一 ...
- POJ 2528 Mayor's posters(线段树)
题目大意 贴海报.每张海报的高度都是一样的,唯独宽度不一样.每张海报只能占用整数倍的单位线段长度,贴了 n(n<=10000) 张海报之后,有几张能够看见(有一个角能看见这张海报也算被看见了)? ...
- poj 2528 Mayor's posters(线段树+离散化)
1 /* 2 poj 2528 Mayor's posters 3 线段树 + 离散化 4 5 离散化的理解: 6 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用 ...
- POJ-2528 Mayor's posters (离散化, 线段树)
题目传送门: POJ-2528 题意就是在一个高度固定的墙面上贴高度相同宽度不同的海报,问贴到最后还能看到几张?本质上是线段树区间更新问题,但是要注意的是题中所给数据范围庞大,直接搞肯定会搞出问题,所 ...
- POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新
直接将这3题 放一起了 今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...
- hdu 5692 Snacks(dfs序+线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5692 解题思路:这道题是树节点的点权更新,而且涉及到子树,常用的思路是利用dfs序,用线段树来对区间进 ...
- hdu 1698(线段树区间更新)
解题思路:线段树区间更新水题. #include<iostream> #include<cstdio> #include<cstring> using namesp ...
- ZOJ 1610 Count the Colors (线段树区间更新)
题目链接 题意 : 一根木棍,长8000,然后分别在不同的区间涂上不同的颜色,问你最后能够看到多少颜色,然后每个颜色有多少段,颜色大小从头到尾输出. 思路 :线段树区间更新一下,然后标记一下,最后从头 ...
最新文章
- 考研结束了,使用SpringBoot开发一个考研管理系统
- 100多个基础常用JS函数和语法集合大全
- 基于DSP的数字振荡器C语言编程,基于DSP的数字振荡器的设计与实现.pdf
- mysql-mmm 集群高可用软件介绍
- 计算机基本概念及简单的二进制运算
- Python 读入Excel表时如何判空NaN
- 系统动力学模型_RCR新文:基于系统动力学模型的中国煤炭产能情景预测
- 减少工作时间更有利于百姓
- 家用nas的过去现在和未来--2008n年
- ASP.NET2.0 GridView小技巧汇粹 (转)
- 浅谈串口DCB流控制设置
- sqlserver实验心得体会_sql查询操作实验总结.docx
- Linux信号量常用操作表
- ZOJ 3551 Bloodsucker(概率)
- 等待事件:control file parallel write
- pythonembed版是什么意思_HTML中embed什么意思?有哪些作用?(附代码)
- github 本地 fatal: couldn‘t find remote ref master错误解决方案
- mysql建库、建表命令、sql语句大全
- java 代码 二义性是什么_Java接口默认方法带来的问题分析【二义性问题】
- linux c++读取excel文件的库