想写 O(n2) 的暴力,的不仅 T 了还 WA,求调。
思路就是先 O(n2) 检查一座山有没有被完全覆盖,然后按左端点排序,最后检查一座山有没有被部分覆盖。
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100005;
bool cover[N];
struct Mountain {
int x1,x2;
}a[N];
bool cmp(Mountain a,Mountain b) {
return a.x1<b.x1;
}
bool check(int i,int j) {
if(a[i].x1<=a[j].x1&&a[j].x2<=a[i].x2)
return true;
return false;
}
int main() {
freopen("mountain.in","r",stdin);
freopen("mountain.out","w",stdout);
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d %d",&a[i].x1,&a[i].x2);
for(int j=1;j<=n;j++)
if(check(i,j)&&i!=j)
cover[i]=true;
}
sort(a+1,a+n+1,cmp);
int last=a[1].x2,ans=(a[1].x2-a[1].x1)*(a[1].x2-a[1].x1);
for(int i=2;i<=n;i++) {
if(cover[i])
continue;
ans+=(a[i].x2-a[i].x1)*(a[i].x2-a[i].x1);
if(a[i].x1<last)
ans-=(last-a[i].x1)*(last-a[i].x1);
last=a[i].x2;
}
printf("%d",ans);
return 0;
}