POJ 2528——Mayor's posters——————【线段树区间替换、找存在的不同区间】
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
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
题目大意:在一块儿宣传栏中贴宣传单,规定宽度相同,长度不同。按一定顺序贴,给出宣传单的起始和结束位置,这里位置不能忽略成点(而是一段长度),问最后会看到几个宣传单。
解题思路:由于给出的数据范围多大,所以要先进行离散化减少复杂度,因为这里给出的不是”点“是带长度的,所以一般的离散化会出现离散失真,这里可以在离散的时候增加技巧,即在不相邻的数据里增加分隔点,凸显不连续。然后进行线段树成段替换,最后求出整个区间的不同宣传单个数。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define mid (L+R)/2
#define lson rt*2,L,mid
#define rson rt*2+1,mid+1,R
const int maxn=50000;
int lm[maxn/2],rm[maxn/2];
int col[maxn*4];
int Hash[maxn];
int A[maxn];
int num=0;
int discretization(int l,int r,int key){ //离散化 while(l<=r){ int m=(l+r)/2;
if(key==A[m]){ return m;
}else if(key<A[m]){ r=m-1;
}else{ l=m+1;
}
}
}
void PushDown(int rt){ if(col[rt]!=-1){ col[rt*2]=col[rt];
col[rt*2+1]=col[rt];
col[rt]=-1;
}
}
void update(int rt,int L,int R,int l_ran,int r_ran,int _col){ if(l_ran<=L&&R<=r_ran){ col[rt]=_col;
return ;
}
PushDown(rt);
if(l_ran<=mid)
update(lson,l_ran,r_ran,_col);
if(r_ran>mid)
update(rson,l_ran,r_ran,_col);
}
void query(int rt,int L,int R){ if(col[rt]!=-1){ if(!Hash[col[rt]]){ num++;
Hash[col[rt]]=1;
}
return ;
}
if(L==R)
return ;
query(lson);
query(rson);
}
void debug(){ for(int i=1;i<32;i++){ printf("%d %d\n",i,col[i]);
}
}
int main(){ int t;
scanf("%d",&t);
while(t--){ int n,nn=0,m;
scanf("%d",&n);
for(int i=0;i<n;i++){ scanf("%d%d",&lm[i],&rm[i]);
A[nn++]=lm[i];
A[nn++]=rm[i];
}
sort(A,A+nn);
m=1;
for(int i=0;i<nn-1;i++){ //去重 if(A[i]!=A[i+1]){ A[m++]=A[i+1];
}
}
for(int i=m-1;i>0;i--){ //添加分隔点 if(A[i]!=A[i-1]+1){ A[m++]=A[i-1]+1;
}
}
sort(A,A+m);
int tml,tmr;
memset(col,-1,sizeof(col));
for(int i=0;i<n;i++){ tml= discretization(0,m-1,lm[i]); //离散化
tmr= discretization(0,m-1,rm[i]); //离散化
update(1,0,m-1,tml,tmr,i);
}
// debug();
memset(Hash,0,sizeof(Hash));
num=0;
query(1,0,m-1);
printf("%d\n",num);
}
return 0;
}
POJ 2528——Mayor's posters——————【线段树区间替换、找存在的不同区间】的更多相关文章
- POJ 2528 Mayor’s posters (线段树段替换 && 离散化)
题意 : 在墙上贴海报, n(n<=10000)个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000).求出最后还能看见多少张海报. 分析 ...
- POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)
POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...
- poj 2528 Mayor's posters 线段树+离散化技巧
poj 2528 Mayor's posters 题目链接: http://poj.org/problem?id=2528 思路: 线段树+离散化技巧(这里的离散化需要注意一下啊,题目数据弱看不出来) ...
- poj 2528 Mayor's posters 线段树区间更新
Mayor's posters Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=2528 Descript ...
- POJ 2528 Mayor's posters (线段树区间更新+离散化)
题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...
- POJ 2528 Mayor's posters(线段树,区间覆盖,单点查询)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 45703 Accepted: 13239 ...
- POJ 2528 Mayor's posters(线段树+离散化)
Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...
- poj 2528 Mayor's posters 线段树+离散化 || hihocode #1079 离散化
Mayor's posters Description The citizens of Bytetown, AB, could not stand that the candidates in the ...
- poj 2528 Mayor's posters(线段树)
题目:http://poj.org/problem?id=2528 题意:有一面墙,被等分为1QW份,一份的宽度为一个单位宽度.现在往墙上贴N张海报,每张海报的宽度是任意的, 但是必定是单位宽度的整数 ...
- POJ 2528 Mayor's posters (线段树)
题目链接:http://poj.org/problem?id=2528 题目大意:有一个很上的面板, 往上面贴海报, 问最后最多有多少个海报没有被完全覆盖 解题思路:将贴海报倒着想, 对于每一张海报只 ...
随机推荐
- Castle Windsor
让我们从Web API的集成点开始,它们是IDependencyResolver和IDependencyScope接口.IDependencyResolver和其他接口的名称可能与MVC中的接口相同, ...
- angular学习文章
https://www.jianshu.com/p/86c6249a2069 angular.cn https://segmentfault.com/a/1190000008754631
- Regex 常用的正则表达式
.校验数字的表达式 数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^\d{m,n}$ 零和非零开头的数字:^(0|[1-9][0-9]*)$ 非 ...
- mysql 按照姓氏排序
1.如果是gbk存储 order by name asc 2.非GBK order by convert(name using gbk) asc
- C# LINQ(7)
大部分的LINQ的关键字都说了,最后说一下排序吧. LINQ的是查询的利器. 那么查询就会有排序. 所有LINQ提供了两种简单的排序.倒序和默认排序. 关键字是: orderby ascending ...
- cp命令覆盖不提示
参数说明 -i, --interactive prompt before overwrite (overrides a previous -n option) #文件存在是,交互式提示是否覆盖 - ...
- 洛谷 P1217 [USACO1.5]回文质数 Prime Palindrome
嗯... 这道题对于蒟蒻的我来说实在是TQL... 先看一下题:(题目链接:https://www.luogu.org/problemnew/show/P1217) 然后说一下我的做题过程吧: 一看到 ...
- JavaWeb学习笔记(一)—— Http协议
一.什么是HTTP协议 HTTP,超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览 ...
- linux的目录和基本的操作命令
目录相关操作:( ctrl+l 清空当前的屏幕中的命令 ) 一:目录说明: . 当前目录.. 上一层目录- 前一个工作目录~ 当前[用户]所在的家目录 蓝色的文件: 都是目录 白 ...
- CodeForces - 645D Robot Rapping Results Report(拓扑排序)
While Farmer John rebuilds his farm in an unfamiliar portion of Bovinia, Bessie is out trying some a ...