问题描述
计蒜理工大学有一个宣传板,大大小小事情的宣传都会往上面贴,上面布满了各种宣传海报。时间一长,上面的海报越来越多,一些陈旧的海报被新的完全覆盖掉了,一点都看不到了。
宣传板的高度和所有海报的高度都是一样的,但是宣传板很长。宣传板的长度为 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;
}