cogs1682. [HAOI2014]贴海报 x
1682. [HAOI2014]贴海报
★★☆ 输入文件:ha14d.in 输出文件:ha14d.out 简单对比
时间限制:1 s 内存限制:256 MB
【题目描述】
Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论。为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙。
张贴规则如下:
1.electoral墙是一个长度为N个单位的长方形,每个单位记为一个格子;
2.所有张贴的海报的高度必须与electoral墙的高度一致的;
3.每张海报以“A B”表示,即从第A个格子到第B个格子张贴海报;
4.后贴的海报可以覆盖前面已贴的海报或部分海报。
现在请你判断,张贴完所有海报后,在electoral墙上还可以看见多少张海报。
【输入格式】
第一行: N M 分别表示electoral墙的长度和海报个数
接下来M行: Ai Bi 表示每张海报张贴的位置
【输出格式】
输出贴完所有海报后,在electoral墙上还可以看见的海报数。
【样例输入】
100 5
1 4
2 6
8 10
3 4
7 10
【样例输出】
4
【提示】

【约束条件】
1 0<= N <= 10000000 1<=M<=1000 1<= Ai <= Bi <=10000000
所有的数据都是整数。数据之间有一个空格
思路:
1)首先这道题暴力可以拿80分!(在luogu上可以AC!!!!)
2)然后考场上作死写了个并查集。。。61分
3)正解:
①线段树(然而我没写~)
②浮水法
坑点:
因为给出的是所位于的块,不是左右端点,所以在处理浮水法的时候记得要右端点+1,或者左端点-1
上代码:
1)暴力
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
using namespace std; const int M = 1e7 + ;
int n,m,l,r,ans;
int a[M],v[M]; inline int reads()
{
int x=,f=;char ch=getchar();
while(ch<'' || ch>'')
{if(ch=='-') f=-;ch=getchar();}
while(ch>='' && ch<='')
{x=*x+ch-'';ch=getchar();}
return x*f;
} int main()
{
freopen("ha14d.in","r",stdin);
freopen("ha14d.out","w",stdout);
n=reads(),m=reads();
for(int i=;i<=m;i++)
{
l=reads(),r=reads();
if(r<l) swap(l,r);
for(int j=l;j<=r;j++)
a[j]=i;
}
for(int i=;i<=n;i++)
{
if(!v[a[i]] && a[i])
{
ans++;
v[a[i]]=;
}
}
printf("%d",ans);
return ;
}
2)作死并查集
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio> using namespace std; inline int reads()
{
int x=,f=;char ch=getchar();
while(ch<'' || ch>'')
{if(ch=='-') f=-;ch=getchar();}
while(ch>='' && ch<='')
{x=*x+ch-'';ch=getchar();}
return x*f;
} const int M = 1e7 + ; ///多开几个
const int N = ;
int n,m;
int f[M];
int ans[M],anse;
int Ls[N],Rs[N]; int getf(int x)
{return f[x] == x ? x : f[x] = getf(f[x]);} int main()
{
freopen("ha14d.in","r",stdin);
freopen("ha14d.out","w",stdout);
n=reads();m=reads(); ///n是n块,不是左右端点!!!
for(int i=;i<=n+;i++)
f[i]=i;
for(int i=;i<=m;i++) ///m组数据
{ ///手动从1开始,从0不会...
Ls[i]=reads();
Rs[i]=reads()+; ///因为给出不是点的坐标,是块的坐标
}
int l,r;
for(int i=m;i>=;i--) ///逆序张贴,因为只需要的是最后的能看到的海报
{
l=Ls[i],r=Rs[i]; ///左右端点
if(l>r) swap(l,r); ///maybe?会出现"left">"right"的情况(考虑最坏情况,以防万一,以前做过一个题就是恶心的数据!)
for(int j=getf(l);j<=r;j=getf(j+))
{
f[getf(j)]=getf(j+); ///将当前被张贴报纸的父结点手动设置到最后一个的父结点
/// ans[j]=i;
ans[i]++;
if(getf()==n+) break; ///表示已经贴完
}
} for(int i=;i<=n+;i++)
{
/// printf("%d=%d\n",i,ans[i]); ///输出调试???
if(ans[i]) anse++;
}
printf("%d\n",anse); return ;
}
3)正解(浮水法)
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std; const int M = ;
int n,m,ans=;
bool v[M]; struct U {
int l,r,id;
//id 为第几张海报
}t[M]; inline int reads()
{
int x=,f=;char ch=getchar();
while(ch<'' || ch>'')
{if(ch=='-') f=-;ch=getchar();}
while(ch>='' && ch<='')
{x=*x+ch-'';ch=getchar();}
return x*f;
} void swim(int ql,int qr,int nowid,int preid)
{
if(v[preid])
return;
while(nowid<=m && (qr<=t[nowid].l || ql>=t[nowid].r))
nowid++;
if(nowid>m)
{
v[preid]=true;
ans++;
return;
}
if(ql<t[nowid].l && qr>t[nowid].l)
swim(ql,t[nowid].l,nowid+,preid);
if(ql<t[nowid].r && qr>t[nowid].r)
swim(t[nowid].r,qr,nowid+,preid);
} int main()
{
freopen("ha14d.in","r",stdin);
freopen("ha14d.out","w",stdout);
n=reads();m=reads();
for(int i=;i<=m;i++)
{
t[i].l=reads(),t[i].r=reads()+;
t[i].id=i;
}
for(int i=m-;i>=;i--)
swim(t[i].l,t[i].r,i+,i);
printf("%d",ans);
return ;
}
cogs1682. [HAOI2014]贴海报 x的更多相关文章
- 【题解】Luogu P3740 [HAOI2014]贴海报
woc,今天已经是day -1了 再写一颗珂朵莉树来++rp吧 否则就要AFO了qaq 这有可能是我最后一篇题解/博客qaq 原题传送门:P3740 [HAOI2014]贴海报 考前刷水题到底是对还是 ...
- 1682. [HAOI2014]贴海报
1682. [HAOI2014]贴海报 ★★☆ 输入文件:ha14d.in 输出文件:ha14d.out 简单对比 时间限制:1 s 内存限制:256 MB [题目描述] Byteto ...
- Luogu P3740 [HAOI2014]贴海报_线段树
线段树版的海报 实际上这个与普通的线段树相差不大,只是貌似数据太水,暴力都可以过啊 本来以为要离散的,结果没打就A了 #include<iostream> #include<cstd ...
- 洛谷P3740 【[HAOI2014]贴海报】
(呃...本蒟蒻的第一篇题解qwq)..不废话了讲正题..思路来源于铺地毯(-->传送门)..先算出每一个格子上覆盖的海报并把可见的海报做标记然后算出有多少海报是可见的..但是作为省选题怎么可能 ...
- BZOJ5168: [HAOI2014]贴海报 线段树
Description Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委 员 会为选民准备了一个张贴海报的electoral墙.张贴规则如下 ...
- 洛谷P3740 [HAOI2014]贴海报
题目描述 Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙. 张贴规则如下: electo ...
- 【线段树】【P3740】 [HAOI2014]贴海报
传送门 Description Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙. 张贴规 ...
- 洛谷 P3740 [HAOI2014]贴海报
题目描述 Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙. 张贴规则如下: electo ...
- [haoi2014]贴海报
Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙.张贴规则如下:1.electoral墙是 ...
随机推荐
- IIS 404设置
想给自己做的的网站自定义一个404页面,开始 双击红框提示的错误页图标 双击上图红框提示的所示404行 修改上图红框提示的内容如下:我是直接在根目录放了一个自己做的404.html,实际情况要填写你自 ...
- [转帖]英特尔的 ME 或侵犯 Minix3 的自由软件许可证
英特尔的 ME 或侵犯 Minix3 的自由软件许可证 [日期:2017-12-11] 来源:Linux公社 作者:非非然 [字体:大 中 小] https://www.linuxidc.com/L ...
- Oracle-DDL 2- 视图&索引
DDL-数据定义语句: 二.视图 --视图(view),本身不保存数据,保存的是一个查询语句--对视图的操作等同于对查询语句中源数据的操作--视图占用存储空间较小,可以快速的对特定数据进行访问和操作- ...
- c++学习之对象和类——构造函数和析构函数
再认真理一遍~ 0.类 这里先来定义一个类,便于后面的理解.参考C++ Primer Plus class Stock { private: std::string company; long sha ...
- GitHub从小白到熟悉<三>
上传文件
- Mysql8 root密码忘记了
需要确定自己的mysql版本是否是8 [root@smonitor ~]# mysql --version mysql Ver 8.0.13 for Linux on x86_64 (MySQL Co ...
- 07 Deque的应用案例-回文检查
- 回文检测:设计程序,检测一个字符串是否为回文. - 回文:回文是一个字符串,读取首尾相同的字符,例如,radar toot madam. - 分析:该问题的解决方案将使用 deque 来存储字符串 ...
- git ignore 如何忽略已经提交的文件修改
git ignore git ignore的作用很简单,本地仓库忽略一些文件的修改. ignore的规格可以按文件匹配,按后缀匹配或者按文件夹匹配. 如果在项目开发过程中,需要忽略某一个文件已经提交的 ...
- 关于hdfs的一些认知
先从网上copy一些优势点 1.高容错性数据自动保存多个副本.它通过增加副本的形式,提高容错性.某一个副本丢失以后,它可以自动恢复,这是由 HDFS 内部机制实现的,我们不必关心. 2.适合批处理它是 ...
- dubbo-admin监控搭建2.6.0版本
首先介绍一下dubbo的一个比较大的改变,那就是在2.6.1及2.6.1以后的版本当中,dubbo将一分为二,分为Dubbo-RPC和Dubbo-Admin,而在2.6.1以前的版本中Dubbo-Ad ...