【poj2528】Mayor's posters
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 64939 | Accepted: 18770 |
Description
- 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
题意:
$N$个人$(1\leq N\leq10^4)$依次贴$N$张等高的海报,给出每张海报的左端点,右端点$l_i,r_i$。$(1\leq l_i\leq r_i\leq10^7)$
后面的海报可能会把前面的海报盖住。问最后能看见几张海报。
题解:
一个比较明显的线段树区间染色问题。但是端点范围太大,直接开数组明显不可行。
所以还要离散化一下。所谓的离散化,就是将一个很大的区间映射成一个很小的区间,而不改变原有的覆盖关系。
但是对于这道题而言,简单的离散化可能会出现错误。
比如说:
例子一:$[1,10][1,4][5,10]$
例子二:$[1,10][1,4][6,10]$
它们普通离散化后都变成了$[1,4][1,2][3,4]$。
线段$2$覆盖了$[1,2]$,线段$3$覆盖了$[3,4]$,那么线段$1$是否被覆盖掉了呢?
例子一是被覆盖掉了,而例子二没有被覆盖。
解决的办法,就是在距离$\geq 1$的两个相邻节点间插入一个点,保证准确性。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct node{int l,r;}a[]; //节点信息
int N,ans;
int c[]; //区间每个点的颜色
bool vis[]; //记录颜色访问信息
int x[]; //离散化后的区间
inline int read(){
int x=,f=;
char c=getchar();
for(;!isdigit(c);c=getchar())
if(c=='-')
f=-;
for(;isdigit(c);c=getchar())
x=x*+c-'';
return x*f;
}
void cover(int num){
if(c[num]!=-){
c[num<<]=c[num<<|]=c[num];
c[num]=-;
}
}
void update(int L,int R,int col,int l,int r,int num){
//如果这个点在需要染色的区间内,直接更新并且返回
if(l>=L && r<=R){
c[num]=col;
return;
}
cover(num); //更新
int mid=(l+r)>>;
if(L<=mid) update(L,R,col,l,mid,num<<); //更新左儿子
if(R>mid) update(L,R,col,mid+,r,num<<|); //更新右儿子
}
void query(int l,int r,int num){
//累加未出现的颜色
if(c[num]!=-){
if(!vis[c[num]]) ans++;
vis[c[num]]=;
return;
}
if(l==r) return; //如果到了叶子则返回
int mid=(l+r)>>;
query(l,mid,num<<); //统计左儿子
query(mid+,r,num<<|); //统计右儿子
}
int main(){
int T=read();
while(T--){
memset(c,-,sizeof(c));
memset(vis,,sizeof(vis));
N=read();ans=;
int p=; //输入点数
int q=; //离散化后点数
for(int i=;i<N;i++){
a[i].l=read();a[i].r=read();
x[p++]=a[i].l;x[p++]=a[i].r;
}
sort(x,x+p);
//去重操作
for(int i=;i<p;i++)
if(x[i]!=x[i-])
x[q++]=x[i];
//离散化操作
for(int i=q-;i>=;i--)
if(x[i]>x[i-]+)
x[q++]=x[i-]+;
sort(x,x+q);
//染色操作
for(int i=;i<N;i++){
int l=lower_bound(x,x+q,a[i].l)-x;
int r=lower_bound(x,x+q,a[i].r)-x;
update(l,r,i,,q,);
}
//统计操作
query(,q,);
printf("%d\n",ans);
}
return ;
}
【poj2528】Mayor's posters的更多相关文章
- 【poj2528】Mayor's posters
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 59254 Accepted: 17167 Description The ...
- 【SDOJ 3741】 【poj2528】 Mayor's posters
Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...
- 【线段树】Mayor's posters
[poj2528]Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 66154 Accept ...
- 【POJ 2528】Mayor’s posters(线段树+离散化)
题目 给定每张海报的覆盖区间,按顺序覆盖后,最后有几张海报没有被其他海报完全覆盖.离散化处理完区间端点,排序后再给相差大于1的相邻端点之间再加一个点,再排序.线段树,tree[i]表示节点i对应区间是 ...
- 【hdu】Mayor's posters(线段树区间问题)
须要离散化处理,线段树的区间改动问题. 须要注意的就是离散化的时候,由于给的数字是一段单位长度,所以须要特殊处理(由于线段的覆盖和点的覆盖是不一样的) 比方:(1,10)(1,4) (6,10) 离散 ...
- POJ2528 Uva10587 Mayor's posters
The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign h ...
- POJ 2528 Mayor's posters(线段树+离散化)
Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...
- 线段树---poj2528 Mayor’s posters【成段替换|离散化】
poj2528 Mayor's posters 题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报 思路:这题数据范围很大,直接搞超时+超内存,需要离散化: 离散化简单的来说就是只取我们需要 ...
- POJ2528 Mayor's posters 【线段树】+【成段更新】+【离散化】
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 39795 Accepted: 11552 ...
随机推荐
- 编译 Deedle
编译 Deedle Deedle 中含有 RProvider. 要编译 Deedle.须要先下载 R.地址: http://cran.cnr.berkeley.edu/bin/windows/base ...
- 使用$.when()解决AJAX异步难题之:多个ajax操作进行逻辑与(and)
上一篇文章"JQuery.deferred提供的promise解决方式",提到了javascript异步操作的3个问题,以及javascript Promise入门.如今我们看下怎 ...
- sanic官方文档解析之websocket(网络套接字)和handle decorators(处理程序装饰器)
1,websocket(网络套接字) 在websocket上Sanic提供了一种简单使用的抽象化,来设置websocket(网络套接字) from sanic import Sanic from sa ...
- UVA - 11019 Matrix Matcher hash+KMP
题目链接:传送门 题解: 枚举每一行,每一行当中连续的y个我们hash 出来 那么一行就是 m - y + 1个hash值,形成的一个新 矩阵 大小是 n*(m - y + 1), 我们要找到x*y这 ...
- Space for commit to queue couldn't be acquired
18/07/27 16:53:53 ERROR source.ExecSource: Failed while running command: tail -F /home/MyBgJavaLan/p ...
- queue — A synchronized queue class
https://docs.python.org/3.6/library/queue.html https://github.com/python/cpython/blob/3.6/Lib/queue. ...
- vue中导出Excel表格
项目中我们可能会碰到导出Excel文件的需求,一般后台管理系统中居多,将table中展示的数据导出保存到本地.当然我们也可以通过一些处理来修改要导出的数据格式,具体需求具体对待. 1.首先我们需要安装 ...
- JS基础篇--JS的event.srcElement与event.target(触发事件对象)
IE下,event对象有srcElement属性,但是没有target属性; Firefox下,event对象有target属性,但是没有srcElement属性.但他们的作用是相当的,即: fire ...
- wukong引擎源码分析之搜索——docid有序的数组里二分归并求交集,如果用跳表的话,在插入索引时会更快
searcher.Search(types.SearchRequest{Text: "百度中国"}) // 查找满足搜索条件的文档,此函数线程安全 func (engine *En ...
- [原创]JAVA获取word表格中数据的方案
上一个项目的开发中需要实现从word中读取表格数据的功能,在JAVA社区搜索了很多资料,终于找到了两个相对最佳的方案,因为也得到了不少网友们的帮助,所以不敢独自享用,在此做一个分享. 两个方案分别是: ...