[HAOI2014]贴海报题解

85 篇文章 0 订阅
49 篇文章 0 订阅

题目

Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论。为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙。
张贴规则如下:
electoral墙是一个长度为N个单位的长方形,每个单位记为一个格子;
所有张贴的海报的高度必须与electoral墙的高度一致的;
每张海报以“A B”表示,即从第A个格子到第B个格子张贴海报;
后贴的海报可以覆盖前面已贴的海报或部分海报。
现在请你判断,张贴完所有海报后,在electoral墙上还可以看见多少张海报。
输入输出格式
输入格式:
第一行: N M 分别表示electoral墙的长度和海报个数
接下来M行: Ai A i Bi B i 表示每张海报张贴的位置
输出格式:
输出贴完所有海报后,在electoral墙上还可以看见的海报数。
输入输出样例
输入样例#1:
100 5
1 4
2 6
8 10
3 4
7 10
输出样例#1:
4

分析

这道题是我们显然是要离散化,离散化后显然是要用数据结构搞一搞,但看数据范围, m1000 m ≤ 1000 ,这代表什么?这代表我们可以用 m2 m 2 的暴力硬过,嗯,暴力即可,不用怀疑。
上代码

#include<bits/stdc++.h>
using namespace std;
struct date{
    int l,r;
}al[1010];
struct date2{
    int q,id;
}qaq[2010];
bool cmp(date2 x,date2 y){
    return x.q<y.q;
}
int n,m,xl[4010],cnt=0,ans=0;
bool cz[2010];
int main(){
    memset(cz,0,sizeof(cz));
    memset(al,0,sizeof(al));
    cz[0]=1;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d%d",&qaq[i*2-1].q,&qaq[i*2].q);
        qaq[i*2-1].id=i*2-1,qaq[i*2].id=2*i;
    }
    sort(qaq+1,qaq+1+m*2,cmp);
    for(int i=1;i<=m*2;i++){
        if((i==2)||(qaq[i].q!=qaq[i-1].q))
            cnt++;
        if(qaq[i].q-qaq[i-1].q>1)
            cnt++;
        if(qaq[i].id%2)
            al[(qaq[i].id+1)/2].l=cnt;
        else
            al[qaq[i].id/2].r=cnt;
    }
    for(int i=1;i<=m;i++)
        for(int j=al[i].l;j<=al[i].r;j++)
            xl[j]=i;
    for(int i=1;i<=cnt;i++)
        if(!cz[xl[i]])
            cz[xl[i]]++,ans++;
    printf("%d\n",ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值