洛谷P3740 【[HAOI2014]贴海报】
(呃。。。本蒟蒻的第一篇题解qwq)。。不废话了讲正题。。思路来源于铺地毯(-->传送门)。。先算出每一个格子上覆盖的海报并把可见的海报做标记然后算出有多少海报是可见的。。但是作为省选题怎么可能会那么简单。。所以加了两个小优化。。缩小范围和标配快读。。。下面放AC代码。。。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
void R(int &x){
int f=1;
x=0;
char s=getchar();
while(s<'0'||s>'9'){
if(s=='-'){
f=-1;
}
s=getchar();
}
while(s>='0'&&s<='9'){
x=x*10+s-'0';
s=getchar();
}
x*=f;
}
const int MAXN=10000001;
int main(){
int n,m;
R(n);
R(m);
int a[m+1],b[m+1],f[m+1];
int beginmi=MAXN,endma=0;
for(int i=1;i<=m;i++){
R(a[i]);
R(b[i]);
f[i]=0;
beginmi=min(beginmi,a[i]);
endma=max(endma,b[i]);
}
for(int i=beginmi;i<=endma;i++){
for(int j=m;j>=1;j--){
if(i<=b[j]&&i>=a[j]){
f[j]=1;
break;
}
}
}
int ans=0;
for(int i=1;i<=m;i++){
ans+=f[i];
}
printf("%d",ans);
return 0;
}