[poj2528]Mayor's posters
题目描述
The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral posters at all places at their whim. The city council has finally decided to build an electoral wall for placing the posters and introduce the following rules:
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.
题目大意
在一面无限长的墙上有很多的画,让你求出最后一共能看到多少画。
解题思路
首先我们看到这个比较恐怖的数据范围(无限oo),对于我们直接维护裸的线段树。线段树先生:。。。我做不到。。。(粗鄙之语)****
不开玩笑了。我们需要思考如何将这个线段树维护的区间尽量的变小。那么因为一面画会占据一段的区间,那么这一段的区间所有的点全都是一样的,那么我们就可以把这个区间当作一个点,这就是我们常常说的离散化。
所谓离散化就是把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。来自百度娘的温馨提示
举个例子:
原数据:1,999,100000,15;处理后:1,3,4,2;
原数据:{100,200},{20,50000},{1,400};
处理后:{3,4},{2,6},{1,5};
做个比方:有一排的香蕉,有一些香蕉是一样的,这些香蕉可以合体成一个王者香蕉中二病又犯了,这个王者香蕉代表着组成他的香蕉臣子。
那么我们就将这个线段树需要维护的区间尽可能的缩小了,减小了时空复杂度。
重点来了,注意离散化的边界,因为离散化时,我们相邻的两个区间常常会出现问题,就如这道题,因为是覆盖的问题,我们在离散的时候,会驶两个区间相交,但是无法确定是否是覆盖的还是刚好接触。为了防止这种问题,我们需要通过+1来区别区间和区间之间的边界问题,也就是要新增节点是前一个节点+1,保证了离散化的正确性。
那么就是线段树的基本操作,稍微讲一下过程:每次将原来的画放到离散化的线段树中,将这个区间标记成\(i\),表示这个是第i号区间覆盖过的地方,在最后统计答案,遍历整个线段树,如果有不一样的为遍历的标记,那么就答案++。
ac代码
#include<cstdio>
#include<ctype.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#define lson nod<<1
#define rson nod<<1|1
#define N 100005
using namespace std;
struct node{int l,r;}a[N];
int disc[N],ans;
bool vis[N];
struct SegmantTree{
int tree[N<<2];
void init(){memset(tree,-1,sizeof(tree));}
void pushdown(int nod){tree[lson]=tree[rson]=tree[nod],tree[nod]=-1;}
void update(int l,int r,int ql,int qr,int v,int nod){
if(ql<=l&&r<=qr){tree[nod]=v;return;}
int mid=l+r>>1;
if(tree[nod]!=-1)pushdown(nod);
if(ql<=mid) update(l,mid,ql,qr,v,lson);
if(qr>mid) update(mid+1,r,ql,qr,v,rson);
}
void query(int l,int r,int nod){
if(tree[nod]!=-1){
if(!vis[tree[nod]]) ++ans,vis[tree[nod]]=true;
return;
}
if(l==r)return;
int mid=l+r>>1;
query(l,mid,lson); query(mid+1,r,rson);
}
}St;
int r(){
int w=0,x=0;char ch=0;
while(!isdigit(ch))w|=ch=='-',ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return w?-x:x;
}
int main(){
int cas=r();
while(cas--){
memset(vis,0,sizeof(vis));
St.init();
int n=r(),cnt=0;
for(int i=0;i<n;i++) a[i].l=r(),a[i].r=r(),disc[cnt++]=a[i].l,disc[cnt++]=a[i].r;
sort(disc,disc+cnt);
cnt=unique(disc,disc+cnt)-disc;
int t=cnt;
for(int i=1;i<t;i++) if(disc[i]-disc[i-1]>1) disc[cnt++]=disc[i-1]+1;
sort(disc,disc+cnt);
for(int i=0;i<n;i++){
int x=lower_bound(disc,disc+cnt,a[i].l)-disc;
int y=lower_bound(disc,disc+cnt,a[i].r)-disc;
St.update(0,cnt-1,x,y,i,1);
}
ans=0;
St.query(0,cnt-1,1);
printf("%d\n",ans);
}
return 0;
}
[poj2528]Mayor's posters的更多相关文章
- 线段树---poj2528 Mayor’s posters【成段替换|离散化】
poj2528 Mayor's posters 题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报 思路:这题数据范围很大,直接搞超时+超内存,需要离散化: 离散化简单的来说就是只取我们需要 ...
- poj2528 Mayor's posters(线段树之成段更新)
Mayor's posters Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 37346Accepted: 10864 Descr ...
- poj-----(2528)Mayor's posters(线段树区间更新及区间统计+离散化)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 43507 Accepted: 12693 ...
- poj2528 Mayor's posters(线段树区间覆盖)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 50888 Accepted: 14737 ...
- [POJ2528]Mayor's posters(离散化+线段树)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 70365 Accepted: 20306 ...
- POJ2528 Mayor's posters —— 线段树染色 + 离散化
题目链接:https://vjudge.net/problem/POJ-2528 The citizens of Bytetown, AB, could not stand that the cand ...
- [poj2528] Mayor's posters (线段树+离散化)
线段树 + 离散化 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayor ...
- poj2528 Mayor's posters【线段树】
The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign h ...
- POJ2528:Mayor's posters(线段树区间更新+离散化)
Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...
随机推荐
- C# 多线程 Parallel.For 和 For 谁的效率高?那么 Parallel.ForEach 和 ForEach 呢?
还是那句话:十年河东,十年河西,莫欺少年穷. 今天和大家探讨一个问题:Parallel.For 和 For 谁的效率高呢? 从CPU使用方面而言,Parallel.For 属于多线程范畴,可以开辟多个 ...
- 【php增删改查实例】第十二节 - 数据删除功能
1.单条数据删除 思路:首先,需要也只能允许用户勾选一条数据,然后弹出一个确认框,问用户是否真的要删除?如果是,就把ID传递到PHP,然后写一个delete语句,通过ID去删除即可. 画好了按钮之后, ...
- .net core实践系列之短信服务-Sikiro.SMS.Bus服务的实现
前言 前两篇<.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现>.<.net core实践系列之短信服务-Api的SDK的实现与测试>分别讲解了AP ...
- Visual Studio2017 Remote Debugger
前言 大家在使用vs打包后的文件部署到服务器后,有时候我们需要对线网的后台进行调试.但是它不像在VS中.这个时候我们该怎么调试呢? 微软想到了这一点,他们在 VS 中给我们提供了一个功能: Remot ...
- 数组-在Shell脚本中的基本使用介绍
Shell脚本在运维工作中是极其重要的,而数组在shell脚本里的运用无论是在循环或运算方面都是非常实用的一个环节.下面是对shell脚本中数组方面一些操作在此进行记录,希望能帮助到有兴趣的朋友~1. ...
- Linux 第七章学习笔记
1:链接概述 链接(linking)是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储并执行. 编译系统提供的调用预处理器.编译器.汇编器和链接器来构造目标 ...
- js 基础-&& || 逻辑与和逻辑或
今天百度发现一个简化长if else if 语句的方法,看起来及其强大,感觉这样虽然对系统性能提升没有帮助但是代码更简练了,分析了一番,下面先说说自己学到的理论. 首先要弄清楚js 中对于 变量, ...
- 如何实现基于ssh框架的投票系统的的质量属性
如何实现基于ssh框架的投票系统的的质量属性: 项目 :网上考试系统 我做的是网上考试系统,因为标准化的考试越来越重要,而通过计算机进行标准化判卷,系统会自动判卷出成绩,组织考试的人不用组织人员打印试 ...
- OSGB数据压缩
OSGB数据输出时压缩数据大小,采用如下设置 osgDB::writeNodeFile(*osgbNode, "xxx/xxxx.osgb", new osgDB::Options ...
- sprint最后冲刺-out to out
摘要:团队合作.实现四则APP,上传代码到github. 1.之前我们队一直无法把代码上传到github.直到今天.找到了一种可以协助代码上github的软件msysgit. 经过:(一行行看) 我们 ...