题目描述
Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论。为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙。
张贴规则如下:
-
electoral墙是一个长度为N个单位的长方形,每个单位记为一个格子;
-
所有张贴的海报的高度必须与electoral墙的高度一致的;
-
每张海报以“A B”表示,即从第A个格子到第B个格子张贴海报;
-
后贴的海报可以覆盖前面已贴的海报或部分海报。
现在请你判断,张贴完所有海报后,在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; }