【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 ...
随机推荐
- snip_opencv环境配置和测试程序
opencv2.4.9环境变量配置的记录. 2014年8月10日 Microsoft Windows XP [版本 5.1.2600](C) 版权所有 1985-2001 Microsoft Corp ...
- layer弹出层不居中解决方案,仅显示遮罩,没有弹窗
问题:项目中layer询问层的弹窗仅显示遮罩层,并不显示弹窗…… 原因:图片太多将layer弹窗挤出屏幕下方,看不见了…… 解决方案:让layer的弹出层居中显示 一.问题描述 用layer做操作结果 ...
- Visual Studio自动生成文件版本信息
一. 前言 通常,要控制输出文件的版本信息,只需要手动修改资源rc文件中的Version,即可在输出文件的文件属性里查看到对应的版本信息.如下图: 但是,版本号是会随时都更新的,每次bu ...
- HDU 3714/UVA1476 Error Curves
Error Curves Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- linux下使用无线网卡的命令行方法(wifi,iwconfig)
原文地址:linux下使用无线网卡的命令行方法(wifi,iwconfig) 作者:andyhzw (1)首先关闭开发板的有线网卡 [root@FriendlyARM /]# ifconfig eth ...
- bootstrap的学习注意点
1.bootstrop里面所有的内容都需要用一个container 容器包裹起来: 2.一屏二屏什么的,是通过id 与href实现的: 3.下拉与菜单之类的都有固定的代码: 4.需要修改相关属性的话, ...
- 字符串查找函数(BF)
//模拟字符串定位函数 // s: abcbbghi // t: ghi // 返回6 #include <iostream> #include <string> #inclu ...
- “There's no Qt version assigned to this project for platform ” - visual studio plugin for Qt
1.find menu "Qt VS Tools", select Qt Options 2.add a new Qt version 3. right click the tar ...
- uestc 250 windy数(数位dp)
题意:不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 思路:数位dp #include<iostream ...
- 西交校赛 F. GZP and Poker
F. GZP and Poker GZP often plays games with his friends.Today they went to a board game.There are n ...