题目
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
分析
这道题是我们显然是要离散化,离散化后显然是要用数据结构搞一搞,但看数据范围,
m≤1000
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;
}