贴海报

题目描述

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

张贴规则如下:

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

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

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

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

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

输入格式

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

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

输出格式

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

输入输出样例

输入 #1
100 5
1 4
2 6
8 10
3 4
7 10
输出 #1
4

说明/提示

【约束条件】

1 0<= N <= 10000000 1<=M<=1000 1<= Ai <= Bi <=10000000

所有的数据都是整数。数据之间有一个空格

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 10000000+10,MAXM=1000+10;
int n,m,ans=0,j,A[MAXM],B[MAXM];

bool vis[MAXM];

inline int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-'){
            w=-1;
        }
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=s*10+ch-'0';
        ch=getchar();
    }
    return s*w;
}

void work(int a, int b, int l){
    if (vis[j]){
        return;
    }
    while(l<=m&&(a>=B[l]||b<= A[l])){
        ++l;
    }
    if(l>m){
        ans++;
        vis[j]=true;
    }
    if(a<A[l]&&A[l]<b){
        work(a,A[l],l+1);
    }
    if(b>B[l]&&B[l]>a){
        work(B[l],b,l+1);
    }
}
int main(){
    n=read();
    m=read();
    for(int i=1;i<=m;i++){
        A[i]=read();
        B[i]=read();
        ++B[i];
    }
    for(j=m-1;j>=1;j--){
        work(A[j],B[j],j+1);
    }
    printf("%d",ans+1);
    return 0;
}
原文地址:https://www.cnblogs.com/hrj1/p/11212113.html