【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 ...
随机推荐
- openwrt - squashfs-sysupgrade.bin 的生成过程
squashfs-sysupgrade.bin 生成过程图 路径变量 $(KERNEL_BUILD_DIR)="/home/sam/Projects/openwrt-mt7620n/buil ...
- (转)CSS3全局实现所有元素的内边距和边框不增加
全局设置 border-box 很好,首先它符合直觉,其次它可以省去一次又一次的加加减减 它还有一个关键作用——让有边框的盒子正常使用百分比宽度.但是使用了 border-box 可能会与一些依赖默认 ...
- Python开发【2.1 面向对象】
1.面向对象概述 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类 ...
- WPF使用HierarchicalDataTemplate绑定Dictionary生成TreeView
Dictionary中的<string, CustomeType>CustomeType是一个集合,将其绑定生成一棵树,树的第一层节点是Dictionary的Key,第二层是Custome ...
- 苹果应用内支付(iOS IAP)的流程与常用攻击方式
1. 客户端直接verify苹果的receipt 如果verify成功 自行发放商品 2. 客户端将receipt传给server,由server进行验证并发放商品 按照安全性原则, 客户端的所有信息 ...
- Xamarin.Android 记事本(一)
导读 1.视图及数据库的创建 2.listview数据绑定 3.listview的点击事件 正文 如何创建一个listview,大家可以看这里,基本流程操作是一模一样的,我就不多说了,然后就是新建一个 ...
- eclipse创建maven web app
1 这个功能是由eclipse的插件maven archetype plugin支持的 2 创建过程 File->New->Maven Project 选择archetype为maven- ...
- Aspose 直接插入SQL Server DataTalbe
原文链接:http://www.cnblogs.com/hellohongfu/p/7362830.html 下面的代码可以根据excel文件,生成创建表的SQL,以及测试InsertSQL .方法将 ...
- 谈谈Paxos一致性算法和一致性这个名词
转自:http://www.cnblogs.com/esingchan/p/3917718.html 维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的& ...
- 为datanode配置多个数据存储地
datanode配置多个数据存储地址,涉及到以下两个配置项 dfs.name.dir Determines where on the local filesystem the DFS name nod ...