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的更多相关文章

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

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

  2. 1682. [HAOI2014]贴海报

    1682. [HAOI2014]贴海报 ★★☆   输入文件:ha14d.in   输出文件:ha14d.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] Byteto ...

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

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

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

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

  5. BZOJ5168: [HAOI2014]贴海报 线段树

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

  6. 洛谷P3740 [HAOI2014]贴海报

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

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

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

  8. 洛谷 P3740 [HAOI2014]贴海报

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

  9. [haoi2014]贴海报

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

随机推荐

  1. [转帖] Linux下面计算文件数量的方法

    Linux命令-查看目录下文件个数 2018年07月04日 10:37:07 sand_clock 阅读数 2002    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...

  2. 自然语言处理工具hanlp 1.7.3版本更新内容一览

    HanLP 1.7.3 发布了.HanLP 是由一系列模型与算法组成的 Java 工具包,目标是普及自然语言处理在生产环境中的应用.HanLP 具备功能完善.性能高效.架构清晰.语料时新.可自定义的特 ...

  3. CSS(上)

    目录 CSS(上) 什么是CSS? CSS的优点 CSS的引入方式 行内样式 内部样式 外部样式 CSS的两大特性 CSS选择器 基本选择器 组合选择器 更多选择器 选择器的优先级 CSS(上) 什么 ...

  4. TCP/IP 协议是如何保证数据可靠性的?

    原文: 网络基础:TCP协议-如何保证传输可靠性 TCP协议传输的特点主要就是面向字节流.传输可靠.面向连接.这篇博客,我们就重点讨论一下TCP协议如何确保传输的可靠性的. 确保传输可靠性的方式TCP ...

  5. CentOS 7 安装ActiveMQ

    今天给大家介绍一下 CentOS 7 下如何安装ActiveMQ,每个步骤均为亲自己操作后记录.下面我们开始吧. 1.首先进入自己的目录下面,创建并进入 activeMQ 文件夹(mkdir acti ...

  6. webAapi

    学习目标: 掌握API和Web API的概念 掌握常见浏览器提供的API的调用方式 能通过Web API开发常见的页面交互功能 能够利用搜索引擎解决问题 typora-copy-images-to: ...

  7. python用jdbc读取oracle表和列的信息,生成java代码

    这个项目的地址 传送门 第一个python3项目,对python 还是学习中,请大佬轻喷,欢迎指点 import jaydebeapi from .database import Database d ...

  8. 从一道索引数据结构面试题看B树、B+树

    题目1: Mysql数据库用过吧?l里面的索引是基于什么数据结构. 答:主要是基于Hash表和B+树 题目2: 很好请你说一下B+树的实现细节是什么样的?B-树和B+树有什么区别?联合索引在B+树中如 ...

  9. 小程序UI设计之-介绍篇

    工具截图 此工具通过可视化操作进行布局,依据iphone6尺寸设置画布,可以自动生成rpx和百分比的wxss.后续还会增加js代码自动生成.工具中组件按照微信小程序开发规范进行了缺省设置,margin ...

  10. parfile解决exp时tables过多问题

    parfile 一般用于表数据过大.使用导出.导入命令参数过多等场景: 在对oracle数据库使用exp命令导出数据时,如果tables=后面跟的表比较多,就是导致命令行放不下,从而不能导出.百度一把 ...