【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 ...
随机推荐
- OC小实例关于init 方法不小心的错误
OC小实例关于init 方法不小心的错误 正视遇到的每一个错误 在一个遥控器类操控小车玩具的小实例项目中,我采用组合的方式,将遥控器拥有小汽车对象(has a)关系,而不是继承(is a)关系. 想 ...
- iOS清理WebView的缓存
NSHTTPCookie *cookie; NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; ...
- 编译异常之static和extern---more than one storage class specified
static 和 extern 不能同时共存 http://bbs.bccn.net/thread-58129-1-1.html
- 1987年国际C语言混乱代码大赛获奖的一行代码
macb() ? lpcbyu(&gbcq/_\021%ocq\012\0_=w(gbcq)/_dak._=}_ugb_[0q60)s+ 这是CoolShell博主之前做了一个非常有意思的在线 ...
- CentOS笔记-vim
详细的参考http://www.runoob.com/linux/linux-vim.html i插入 I 行首插入 A 行尾插入 fn + ←,行首 fn + →,行尾 fn + ↑,向上翻页 fn ...
- Serializable 序列化 The byte stream created is platform independent. So, the object serialized on one platform can be deserialized on a different platform.
Java 序列化接口Serializable详解 - 火星猿类 - 博客园 http://www.cnblogs.com/tomtiantao/p/6866083.html 深入理解JAVA序列化 - ...
- 手游服务器php架构比较
从swoole项目开始到现在,一直有人在问这个问题.今天来抽空讲一下它.为什么swoole非要使用纯C来写而不是PHP代码来实现,核心的原因有2点: 1. PHP无法直接调用操作系统API 如send ...
- 使用Android Studio查看API文档
在使用Android Studio编码时,若要查看某个类或函数的释义, 只需将光标移动至要查看释义的代码处,然后按下Ctrl+Q,便会弹出文档描述. 然而,有时候会出现如下状况: 因为默认查看的是在线 ...
- lstat函数的使用【学习笔记】
通过lstat函数获取文件的类型的代码如下. #include "apue.h" int main(int argc,char *argv[]) { int i; struct s ...
- tload
tload命令以图形化的方式输出当前系统的平均负载到指定的终端.假设不给予终端机编号,则会在执行tload指令的终端机显示负载情形. 语法 tload(选项)(参数) 选项 -s:指定闲时的刻度: - ...