站外题求助!
  • 板块学术版
  • 楼主xiaoshumiao
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/1/17 21:12
  • 上次更新2024/1/18 08:35:32
查看原帖
站外题求助!
1008513
xiaoshumiao楼主2024/1/17 21:12

Problem

想写 O(n2)\mathcal O(n^2) 的暴力,的不仅 T 了还 WA,求调。

思路就是先 O(n2)\mathcal O(n^2) 检查一座山有没有被完全覆盖,然后按左端点排序,最后检查一座山有没有被部分覆盖。

#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;
}
2024/1/17 21:12
加载中...