poj2528 线段树+离散化 (倒序)
- Every candidate can place exactly one poster on the wall.
- All posters are of the same height equal to the height of the wall; the width of a poster can be any integer number of bytes (byte is the unit of length in Bytetown).
- The wall is divided into segments and the width of each segment is one byte.
- Each poster must completely cover a contiguous number of wall segments.
They have built a wall 10000000 bytes long (such that there is enough place for all candidates). When the electoral campaign was restarted, the candidates were placing their posters on the wall and their posters differed widely in width. Moreover, the candidates started placing their posters on wall segments already occupied by other posters. Everyone in Bytetown was curious whose posters will be visible (entirely or in part) on the last day before elections.
Your task is to find the number of visible posters when all the posters are placed given the information about posters' size, their place and order of placement on the electoral wall.
Input
Output
The picture below illustrates the case of the sample input.
Sample Input
1
5
1 4
2 6
8 10
3 4
7 10
Sample Output
4 题意:有一块足够长的墙了给竞选人贴海报,后贴的可能会把衣面贴的给覆盖掉,问最有多少不同的海报是能看到的。
题解:遇到这种题可以想到,并查集星球大战那道题目,就是后面的会将前面的影响,而前面的结果会被覆盖,这样就可以理解为
越往后面加进来优先级越高,所以就是前面的只会露出当前有的空的面积,所以就十分简单了。
这个代码绝对不是我打的,但是可以参考,当时贴代码比较爽。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1 const int maxn = ;
bool hash[maxn];
int li[maxn] , ri[maxn];
int X[maxn*]; /*最多3倍~*/
int col[maxn<<]; /*2X的空间复杂度是普通的四倍*/
int cnt; void PushDown(int rt) {
if (col[rt] != -) {
col[rt<<] = col[rt<<|] = col[rt]; /*直接赋值 覆盖之~*/
col[rt] = -;
}
}
void update(int L,int R,int c,int l,int r,int rt) {
if (L <= l && r <= R) {
col[rt] = c;
return ; /*盖了果断return*/
}
PushDown(rt);
int m = (l + r) >> ;
if (L <= m) update(L , R , c , lson);
if (m < R) update(L , R , c , rson);
}
void query(int l,int r,int rt) {
if (col[rt] != -) {
if (!hash[col[rt]]) cnt ++;
hash[ col[rt] ] = true;
return ; /*由于这里是直接return,在最顶层的mark处直接跳过此区间,所以不用在下面加PushDown*/
}
if (l == r) return ;
int m = (l + r) >> ;
query(lson);
query(rson);
}
int Bin(int key,int n,int X[]) { /*离散化哈希函数*/
int l = , r = n - ;
while (l <= r) { /*离散化哈希--二分映射*/
int m = (l + r) >> ;
if (X[m] == key) return m;
if (X[m] < key) l = m + ;
else r = m - ;
}
return -; /*注意key值一定要在X中,否则各种跪*/
}
int main() {
int T , n;
scanf("%d",&T);
while (T --) {
scanf("%d",&n);
int nn = ;
for (int i = ; i < n ; i ++) { /*把所有出现的数装在X里*/
scanf("%d%d",&li[i] , &ri[i]);
X[nn++] = li[i];
X[nn++] = ri[i];
}
sort(X , X + nn);
int m = ;
for (int i = ; i < nn; i ++) { /*排序之后去重*/
if (X[i] != X[i-]) X[m ++] = X[i];
}
for (int i = m - ; i > ; i --) { /*离散化技巧:凸显间隔(可避免上文的数据2出错)*/
if (X[i] != X[i-] + ) X[m ++] = X[i-] + ;
}
sort(X , X + m); /*再次排序,便于之后设计映射时用二分高效hash*/
memset(col , - , sizeof(col));
for (int i = ; i < n ; i ++) {
int l = Bin(li[i] , m , X); /*Bin为离散哈希函数*/
int r = Bin(ri[i] , m , X); /*Bin为离散哈希函数*/
update(l , r , i , , m , ); /*以离散后的键值更新线段树*/
}
cnt = ;
memset(hash , false , sizeof(hash));
query( , m , );
printf("%d\n",cnt);
}
return ;
}
poj2528 线段树+离散化 (倒序)的更多相关文章
- poj2528(线段树+离散化)Mayor's posters
2016-08-15 题意:一面墙,往上面贴海报,后面贴的可以覆盖前面贴的.问最后能看见几种海报. 思路:可以理解成往墙上涂颜色,最后能看见几种颜色(下面就是以涂色来讲的).这面墙长度为1~1000 ...
- poj2528 线段树+离散化
由于坐标可能很大,此时需要离散化,将值转化为对应的坐标. #include<stdio.h> #include<algorithm> using namespace std; ...
- POJ2528 线段树离散化
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 62771 Accepted: 18120 ...
- [poj2528] Mayor's posters (线段树+离散化)
线段树 + 离散化 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayor ...
- poj-2528线段树练习
title: poj-2528线段树练习 date: 2018-10-13 13:45:09 tags: acm 刷题 categories: ACM-线段树 概述 这道题坑了我好久啊啊啊啊,,,, ...
- POJ 2528 Mayor's posters(线段树+离散化)
Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...
- poj 2528 Mayor's posters(线段树+离散化)
/* poj 2528 Mayor's posters 线段树 + 离散化 离散化的理解: 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用线段树求解的话,很明显 ...
- [UESTC1059]秋实大哥与小朋友(线段树, 离散化)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1059 普通线段树+离散化,关键是……离散化后建树和查询都要按照基本法!!!RE了不知道多少次………………我真 ...
- poj 2528 Mayor's posters 线段树+离散化技巧
poj 2528 Mayor's posters 题目链接: http://poj.org/problem?id=2528 思路: 线段树+离散化技巧(这里的离散化需要注意一下啊,题目数据弱看不出来) ...
随机推荐
- (转载)深入Java关键字this的用法的总结
在Java程序设计中经常会见到this的使用,this使得程序设计变得规范.简单.灵活.但是在使用过程中,在不同场 合它的含义并不完全相同,使用不当还会出现错误, 本文对this的几种用法和出现的问题 ...
- monogodb使用
菜鸟教程有相关介绍,已经很详细. http://www.runoob.com/mongodb/mongodb-databases-documents-collections.html 网上找了一些博客 ...
- H2Engine服务器引擎介绍
H2Engine服务器引擎介绍 简介 H2Engine服务器引擎架构是轻量级的,与其说是引擎,个人觉得称之为平台更为合适.因为它封装的功能非常精简,但是提供了非常简洁方便的扩展机制,使得可以用C++. ...
- hdu 6199 沈阳网络赛---gems gems gems(DP)
题目链接 Problem Description Now there are n gems, each of which has its own value. Alice and Bob play a ...
- AOP TP框架有感
自学AOP感觉面向切面编程是一种利器,同时也是一种潜在的威胁.他就像一把手术刀,无论哪个器官有问题他都可以把他切开,修复它,但是使用的多了身体也会受不了... AOP应该算是面向对象的一种补充,但是, ...
- 转: 【Java并发编程】之二十:并发新特性—Lock锁和条件变量(含代码)
简单使用Lock锁 Java5中引入了新的锁机制--Java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lock接 ...
- 201521123022 《Java程序设计》 第六周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 Q1.clone方法 Q1.1 Objec ...
- 201521123030《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 控制可见性的4个访问修饰符 private -- 仅对本类可见 public -- 对所有类 ...
- 201521123042《Java程序设计》 第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. ①finally块:无论是否被捕获或执行异常一定会被执行. 在try或catch中遇到return语句时,final ...
- Java项目生成Jar文件
打开 Jar 文件向导 Jar 文件向导可用于将项目导出为可运行的 jar 包. 打开向导的步骤为: 在 Package Explorer 中选择你要导出的项目内容.如果你要导出项目中所有的类和资源, ...