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墙是 ...
随机推荐
- Django 模版语法与使用
目录 Django 模版语法与使用 django模板语言介绍 (摘自官方文档) 链接 什么是模板? 模板语句的 注释 变量 {{ 变量 }} 点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值 ...
- idea自定义注释
类配置位置: 方法配置位置 配置内容 * * @Author *** * @Date $date$ $time$ $param$ * @return $return$ * @Description * ...
- EJS学习(五)之EJS的CommonJs规范版本
EJS的CommonJs规范版本 ejs分为两个版本一个是CommonJs版本,另外一个是AMD规范的版本. 基础:html页面 安装:<script type="text/javas ...
- 03 Linux下运行Django项目
1.安装windows和linux传输文件的工具 pip install lrzsz 提供两个命令 一个是上传一个是下载 rz 接收 直接rz sz 上传 直接sz 或者直接拖拽 2.在线下载资源的命 ...
- 记一些使用mpvue时遇到的问题
一.在mpvue中使用vuex(和在vue中使用不同) 1.vue中使用vuex,在main.js中: import store from './store' new Vue({ store }) ...
- python视频学习笔记4(函数)
函数中return和print的区别,没有return会默认返回None值 函数定义:所谓**函数**,就是把 **具有独立功能的代码块** 组织为一个小模块,在需要的时候 **调用** 1.函数的步 ...
- 使用shell脚本自动打包上传 fir.im
http://blog.csdn.net/wang631106979/article/details/52299083
- 因xhost命令和DISPLAY环境变量操作不当导致无法启动Oracle图形化安装界面
在redhat操作系统上安装Oracle 11.1时,遇到在执行runInstaller后无法启动安装图像化界面,甚是郁闷. 问题现象: 使用Xmanager2.0软件登陆AIX桌面,root用户可以 ...
- Linux课程学习 第三课
生活中的许多事,并不是我们不能做到,而是我们不相信能够做到 https://www.linuxcool.com/ 一个很实用的Linux命令查询网站,并且还有发音 如果我们在系统终端中执行一个命令后想 ...
- Golang 方法接收者是值还是指针问题
对于普通结构体作为接收者,值和指针并没有区别. (以下代码摘抄自Go In Action 中文版) type defaultMatcher struct{} // 方法声明为使用 defaultMat ...