题目描述

Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论。为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙。

张贴规则如下:

  1. electoral墙是一个长度为N个单位的长方形,每个单位记为一个格子;

  2. 所有张贴的海报的高度必须与electoral墙的高度一致的;

  3. 每张海报以“A B”表示,即从第A个格子到第B个格子张贴海报;

  4. 后贴的海报可以覆盖前面已贴的海报或部分海报。

现在请你判断,张贴完所有海报后,在electoral墙上还可以看见多少张海报。

输入输出格式

输入格式:

第一行: N M 分别表示electoral墙的长度和海报个数

接下来M行: Ai Bi 表示每张海报张贴的位置

输出格式:

输出贴完所有海报后,在electoral墙上还可以看见的海报数。


这题其实挺不错的,很典型的那种区间染色问题,所以记录一下,以便日后复习。

解法一:线段树

这种题一看就是线段树,我们选择边判断边建树,这样就省去了build和pushdown。把线段树用来存储每条线段是否全部露出来,判断的时候,如果目标线段里有一个点没有被挡住(即segtree[root]==0),那么这条海报就会露出来,ans++,然后把整条线段染色后上推,由于我们刚刚对线段树储存元素的要求,所以上推法则就是:如果一个点有一个子树有标记,那么它也有标记。记得从最上面那个海报开始判断,这样应该就没什么问题了。

#include<cstdio>
#include<iostream>
using namespace std;
int flag,sum[],i,m,n;
int a[],b[],ans;
inline void pushup(int rt){
sum[rt]=sum[rt<<]&&sum[rt<<|];
}
inline void cck(int rt,int l,int r,int x,int y){
if (sum[rt]) return;
if (x>r||y<l) return;
if (x<=l&&r<=y){
flag=; sum[rt]=;
return;
}
int mid=(l+r)>>;
if (mid>=x) cck(rt<<,l,mid,x,y);
if (mid<r) cck(rt<<|,mid+,r,x,y);
pushup(rt);
}
int main(){
scanf("%d%d",&m,&n);
m=;
for (i=; i<=n; i++){
scanf("%d%d",&a[i],&b[i]);
m=max(m,b[i]);
}
for (i=n; i>=; i--){
flag=;
cck(,,m,a[i],b[i]);
if (flag) ans++;
}
printf("%d",ans);
return ;
}

解法二:浮水法

这是一种专门解决区间染色问题的方法,思路大概是这样:

还是倒着判断,找到与海报i相交的海报j,不管他们的公共部分(因为被j挡住了),之后判断它们不相交的部分(这时i的面积变成了公共部分的面积,可能有两个公共部分,这里由递归实现),方法详见代码注释。

inline void water(int l,int r,int now,int p){ //p就是i,now用来枚举j,l,r是当前判断i的边界,a是左边界,b是右边界
   if (vis[p]) return;  //vis用于快速推出递归
while (now<=n&&(l>=b[now]||r<=a[now])) now++; //这里是判断相交
if (now>n){      //now>n则没有海报挡得住i了
ans++; vis[p]=;
return;
}
if (l<a[now]&&r>a[now]) water(l,a[now],now+,p); //不好讲,要不,自己画个图模拟一下?
if (r>b[now]&&l<b[now]) water(b[now],r,now+,p); //同上?
}

完整代码

#include<cstdio>
#include<iostream>
using namespace std;
int vis[],a[],b[];
int ans,n,m,i;
inline void water(int l,int r,int now,int p){
if (vis[p]) return;
while (now<=n&&(l>=b[now]||r<=a[now])) now++;
if (now>n){
ans++; vis[p]=;
return;
}
if (l<a[now]&&r>a[now]) water(l,a[now],now+,p);
if (r>b[now]&&l<b[now]) water(b[now],r,now+,p);
}
int main(){
scanf("%d%d",&m,&n);
for (i=; i<=n; i++){
scanf("%d%d",&a[i],&b[i]);
b[i]++;
}
vis[n]=; ans=;
for (i=n-; i>=; i--){
water(a[i],b[i],i+,i);
}
printf("%d",ans);
return ;
}

洛谷 P3740 [HAOI2014]贴海报的更多相关文章

  1. 洛谷P3740 [HAOI2014]贴海报

    题目描述 Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙. 张贴规则如下: electo ...

  2. 洛谷 3740 [HAOI2014]贴海报

    [题解] 线段覆盖问题.线段树或者并查集都可以.不离散化居然能过? #include<cstdio> #include<algorithm> #define N 1000001 ...

  3. 【题解】Luogu P3740 [HAOI2014]贴海报

    woc,今天已经是day -1了 再写一颗珂朵莉树来++rp吧 否则就要AFO了qaq 这有可能是我最后一篇题解/博客qaq 原题传送门:P3740 [HAOI2014]贴海报 考前刷水题到底是对还是 ...

  4. 洛谷P3740 【[HAOI2014]贴海报】

    (呃...本蒟蒻的第一篇题解qwq)..不废话了讲正题..思路来源于铺地毯(-->传送门)..先算出每一个格子上覆盖的海报并把可见的海报做标记然后算出有多少海报是可见的..但是作为省选题怎么可能 ...

  5. Luogu P3740 [HAOI2014]贴海报_线段树

    线段树版的海报 实际上这个与普通的线段树相差不大,只是貌似数据太水,暴力都可以过啊 本来以为要离散的,结果没打就A了 #include<iostream> #include<cstd ...

  6. BZOJ 5168 && Luogu P3740 [HAOI2014]贴海报 线段树~~

    据说某谷数据十分水...但幸好BZOJ上也过了...话说我记得讲课时讲的是奇奇怪怪的离散化..但现在突然觉得什么都可以线段树瞎搞了...QAQ 直接就是这个区间有没有被覆盖,被覆盖直接return: ...

  7. Luogu P3740 [HAOI2014] 贴海报 线段树

    线段树版的海报 实际上这个与普通的线段树相差不大,只是貌似数据太水,暴力都可以过啊 本来以为要离散的,结果没打就A了 #include<iostream> #include<cstd ...

  8. P3740 [HAOI2014]贴海报

    题目描述 Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙. 张贴规则如下: electo ...

  9. 【文文殿下】P3740 [HAOI2014]贴海报

    题解 一开始想到离散化,然后暴力模拟.但是存在一种hack数据: [5,7] [1,5] [7,9] 这样会错误的认为第一个区间被覆盖了(因为两个端点被覆盖).所以我们设置一个玄学调参系数,在一个区间 ...

随机推荐

  1. java8 api简介(一)

    from https://www.aliyun.com/jiaocheng/785076.html 摘要:函数式编程详解:前言:现在有很多公司都用了jdk8,但是函数式编程也许没有用上,jdk8也提供 ...

  2. enable orgmode latex preview to support retina on mac

    Table of Contents 1. enable orgmode latex preview to support retina on mac 1.1. get the proper versi ...

  3. java - Socket简单编程实践

    1.简介: 1)SOCKET是应用程序和网络之间的一个接口.SOCKET创建设置好以后,应用程序可以: 通过网络把数据发送到socket . 通过网络从socket接收数据.(通信的前提是应用程序知道 ...

  4. Fiddler 抓包工具总结(转)

    Fiddler 抓包工具总结   阅读目录 1. Fiddler 抓包简介 1). 字段说明 2). Statistics 请求的性能数据分析 3). Inspectors 查看数据内容 4). Au ...

  5. 关于web开发中订单自动超时和自动收货的简单方法(window server)

    最近做一个订单自动超时和自动收货的功能,因为以前是用的mysql 存储过程和定时器来完成,这次的业务逻辑相对复杂用以前的方式就不太合适,本来是准备使用定时执行php脚本来实现的,后来发现业务逻辑中使用 ...

  6. 关于dependencies和devDependencies的理解

    npm install 会下载dependencies和devDependencies中的模块,当使用npm install --production或者注明NODE_ENV变量值为productio ...

  7. COGS 1365. [HAOI2013] 软件安装

    ★★☆   输入文件:haoi13t4.in   输出文件:haoi13t4.out   简单对比时间限制:1 s   内存限制:128 MB Dr.Kong有一个容量为N MB (1 <= N ...

  8. Head First HTML与CSS阅读笔记(一)

    之前写过不少前端界面,但是没有完整阅读过一本HTML与CSS的书籍,都是用到什么查什么,最近闲暇之余想巩固加深一下前端基础方面的知识,阅读了<Head First HTML与CSS>,感觉 ...

  9. EM理解(转)

    EM是我一直想深入学习的算法之一,第一次听说是在NLP课中的HMM那一节,为了解决HMM的参数估计问题,使用了EM算法.在之后的MT中的词对齐中也用到了.在Mitchell的书中也提到EM可以用于贝叶 ...

  10. web跨域及cookie相关知识总结

    原文:web跨域及cookie相关知识总结   之前对于跨域相关的知识一致都很零碎,正好现在的代码中用到了跨域相关的,现在来对这些知识做一个汇总整理,方便自己查看,说不定也可能对你有所帮助. 本篇主要 ...