计蒜客习题:学校的宣传板

问题描述

计蒜理工大学有一个宣传板,大大小小事情的宣传都会往上面贴,上面布满了各种宣传海报。时间一长,上面的海报越来越多,一些陈旧的海报被新的完全覆盖掉了,一点都看不到了。
宣传板的高度和所有海报的高度都是一样的,但是宣传板很长。宣传板的长度为 m,每次贴完海报,都会做一个记录,这张海报贴在了宣传板的 a 到 b 处。
希望你能通过这些数据,来计算出宣传板上有多少张海报是可以看到的。(只要能看到一个角,也算能看到)
输入格式
第一行俩个整数,n 和 m,分别表示海报的总个数和宣传板的长度。(1≤n≤10^4 ,2≤m≤10^9)
接下来 n 行,每行俩个整数 a, b 表示海报的位置。输入的顺序代表贴海报的顺序,后面的海报会盖住前面的海报。(1≤a

5 100
20 35
5 30
50 80
31 60
55 85

样例输出

3

AC代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <map>
using namespace std;
#define dbg(x) cout<<#x<<" = "<< (x)<< endl
const int MAX_N = 10005;
int n,w;
struct node {
    int x;
    int y;
}num[MAX_N];
map<int ,int > mp;
int tp[MAX_N*2],vis[MAX_N*2];
int main(){
    scanf("%d%d",&n,&w);
    for(int i=0;i<n;++i){
        scanf("%d%d",&num[i].x,&num[i].y);
        tp[i*2] = num[i].x;
        tp[i*2+1] = num[i].y;
    }
    sort(tp,tp+n*2);
    int m = unique(tp,tp+n*2)-tp;
    for(int i=0;i<m;++i){
        mp[tp[i]]=i+1;
    }
    int ans = n;
    for(int i=n-1;i>=0;i--){
        num[i].x=mp[num[i].x];
        num[i].y=mp[num[i].y];
        int num_ = 0;
        for(int j = num[i].x;j<=num[i].y;j++){
            if(vis[j]==1) {
                num_++;
               // dbg(num_);
            }
            else vis[j] = 1;
            if(num_ == num[i].y-num[i].x+1){
                //dbg(num[i].y-num[i].x+1);
                ans--;
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/liukairui/article/details/80921740
今日推荐