Mayor's posters(离散化线段树)
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 54067 | Accepted: 15713 |
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
题解:
本题大意:给定一些海报,可能相互重叠,告诉你每个海报的宽度(高度都一样的)和先后叠放顺序,问没有被完全盖住的有多少张?
海报最多10000张,但是墙有10000000块瓷砖长,海报不会落在瓷砖中间。
跟颜色段那道题很像,但是写了下wa,最后借助bin神的思路才写出来; ac代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int INF=0x3f3f3f3f;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
#define SD(x,y) scanf("%lf%lf",&x,&y)
#define P_ printf(" ")
#define ll root<<1
#define rr root<<1|1
#define lson ll,l,mid
#define rson rr,mid+1,r
#define V(x) tree[x]
typedef long long LL;
const int MAXN=100010;
bool tree[MAXN<<2];
int h[10000010],seg[MAXN<<1];
struct Node{
int a,b;
Node init(int c,int d){
a=c;b=d;
}
};
Node dt[MAXN];
void build(int root,int l,int r){
V(root)=false;
int mid=(l+r)>>1;
if(l==r)return;
build(lson);build(rson);
}
bool query(int root,int l,int r,int A,int B){
int mid=(l+r)>>1;
if(V(root))return false;//线段树都是从上倒下访问的,覆盖的线段是true,就返回false
bool bcover;
if(l==A&&r==B){
V(root)=true;
return true;
}
if(mid>=B)bcover=query(lson,A,B);
else if(mid<A)bcover=query(rson,A,B);
else{
int b1=query(lson,A,mid);//
int b2=query(rson,mid+1,B);//
bcover=b1||b2;
}
if(V(ll)&&V(rr))V(root)=true;
return bcover;
}
int main(){
int T,N;
SI(T);
while(T--){
SI(N);
int a,b;
int len=0,val=0;
for(int i=0;i<N;i++){
SI(a);SI(b);
dt[i].init(a,b);
seg[len++]=a;seg[len++]=b;
}
sort(seg,seg+len);
int k=unique(seg,seg+len)-seg;
for(int i=0;i<k;i++)h[seg[i]]=i;
int ans=0;
build(1,0,k-1);
for(int i=N-1;i>=0;i--){//从上往下;
if(query(1,0,k-1,h[dt[i].a],h[dt[i].b]))ans++;
}
printf("%d\n",ans);
}
return 0;
}
wa代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int INF=0x3f3f3f3f;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
#define SD(x,y) scanf("%lf%lf",&x,&y)
#define P_ printf(" ")
#define ll root<<1
#define rr root<<1|1
#define lson ll,l,mid
#define rson rr,mid+1,r
#define V(x) tree[x]
typedef long long LL;
const int MAXN=20010;
int color[MAXN];
int temp;
int tree[MAXN<<2];
int seg[MAXN];
struct Node{
int a,b;
Node init(int c,int d){
a=c;b=d;
}
};
Node dt[MAXN];
void pushdown(int root){
if(V(root)>0){
V(ll)=V(root);
V(rr)=V(root);
V(root)=-1;
}
}
void build(int root,int l,int r){
int mid=(l+r)>>1;
V(root)=0;
if(l==r)return;
build(lson);build(rson);
}
void update(int root,int l,int r,int A,int B,int v){
if(l>=A&&r<=B){
V(root)=v;
return;
}
int mid=(l+r)>>1;
pushdown(root);
if(mid>=A)update(lson,A,B,v);
if(mid<B)update(rson,A,B,v);
V(root)=-1;
}
void query(int root,int l,int r){
int mid=(l+r)>>1;
if(temp==V(root))return;
if(!V(root)){
temp=0;return;
}
if(V(root)!=-1){
if(temp!=V(root)){
temp=V(root);
color[temp]++;
return;
}
return;
}
if(l==r)return;
query(lson);
query(rson);
}
int main(){
int T,N;
SI(T);
while(T--){
mem(color,0);
SI(N);
int a,b;
int len=0;
for(int i=0;i<N;i++){
SI(a);SI(b);
dt[i].init(a,b);
seg[len++]=a;seg[len++]=b;
}
sort(seg,seg+len);
int k=unique(seg,seg+len)-seg;
build(1,1,k);
for(int i=0;i<N;i++){
a=lower_bound(seg,seg+k,dt[i].a)-seg;
b=lower_bound(seg,seg+k,dt[i].b)-seg;
update(1,1,k,a+1,b,i+1);
}
temp=0;
query(1,1,k);
int ans=0;
for(int i=1;i<=N;i++){
if(color[i])ans++;
}
printf("%d\n",ans);
}
return 0;
}
Mayor's posters(离散化线段树)的更多相关文章
- 【POJ】2528 Mayor's posters ——离散化+线段树
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Description The citizens of Bytetown, A ...
- poj 2528 Mayor's posters(线段树+离散化)
/* poj 2528 Mayor's posters 线段树 + 离散化 离散化的理解: 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用线段树求解的话,很明显 ...
- POJ 2528 Mayor's posters(线段树/区间更新 离散化)
题目链接: 传送门 Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Description The citizens of By ...
- D - Mayor's posters(线段树+离散化)
题目: The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campai ...
- Mayor's posters (线段树加离散化)
个人心得:线段树也有了一定的掌握,线段树对于区间问题的高效性还是挺好的,不过当区间过大时就需要离散化了,一直不了解离散化是什么鬼,后面去看了下 离散化,把无限空间中有限的个体映射到有限的空间中去,以此 ...
- POJ-2528 Mayor's posters(线段树区间更新+离散化)
http://poj.org/problem?id=2528 https://www.luogu.org/problem/UVA10587 Description The citizens of By ...
- 【POJ 2528】Mayor’s posters(线段树+离散化)
题目 给定每张海报的覆盖区间,按顺序覆盖后,最后有几张海报没有被其他海报完全覆盖.离散化处理完区间端点,排序后再给相差大于1的相邻端点之间再加一个点,再排序.线段树,tree[i]表示节点i对应区间是 ...
- POJ 2528 Mayor's posters(线段树区间染色+离散化或倒序更新)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 59239 Accepted: 17157 ...
- POJ-2528 Mayor's posters (线段树区间更新+离散化)
题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...
随机推荐
- Java getResourceAsStream返回为空的问题
使用 getResourceAsStream("helloworld.propterties") 读取文件的stream,返回一直为空,试这把.properties文件放在 很多路 ...
- jQuery事件对象的属性
注:摘自<锋利的jQuery(第二版)> JQuery在遵循W3C规范的情况下,对事件对象的常用属性进行了封装,使得事件处理在各大浏览器下都可以正常运行而不需要进行浏览器类型判断. 1. ...
- 限制TextBox输入,只能输入整数
public class TextBoxInt : TextBox { public TextBoxInt() { KeyDown += TextBoxInt_KeyDown; TextChanged ...
- 取PE文件的引入表和导出表
直接上代码(这里列出C++和Delphi的代码),Delphi代码中包含导入及导出文件和函数列表,PE结构可参阅资料,很多很详细,需要注意的是,本例中是映射到内存,不是通过PE装载器装入的,所以对于节 ...
- 计算机专业-世界大学学术排名,QS排名,U.S.NEWS排名
2015年美国大学计算机专业排名 计算机专业介绍:计算机涉及的领域非常广泛,其分支学科也是非常多.所以在美国将主要的专业方向分为人工智能,程序应用,计算机系统(Systems)以及计算机理论(theo ...
- libiconv的静态编译
./configure --enable-static=yes --prefix=/usr/local/libiconv CentOS安装transmission » Nicky Blog 安装l ...
- java.lang.OutOfMemoryError: PermGen space 解决方案
只需两步: 将值改为512或者1024,然后CTRL+S,重启tomcat 和eclipse即可.
- visibleViewController和topViewController 获取当前显示的页面
原文:http://blog.sina.com.cn/s/blog_881ed8500102vo38.html UINavigationController 中有visibleViewControll ...
- 3种SQL语句分页写法
在开发中经常会使用到数据分页查询,一般的分页可以直接用SQL语句分页,当然也可以把分页写在存储过程里,下面是三种比较常用的SQL语句分页方法,下面以每页5条数据,查询第3页为例子: 第一种:使用not ...
- 20151113--JSTL
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...