Non-max suppression

版权声明:未经过同意不得转载 https://blog.csdn.net/qq_42500298/article/details/82845131

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct Object
{
 ll u,d,l,r,s;
 int p,x;
 bool flag;
}a[2005];
int n,ans[2005],top;
bool cmp(Object a,Object b)
{
 return a.p>b.p;
}
ll calc(int i,int j)
{
 ll up=min(a[i].u,a[j].u);
 ll down=max(a[i].d,a[j].d);
 ll left=max(a[i].l,a[j].l);
 ll right=min(a[i].r,a[j].r);
 if(up<=down||left>=right)
  return 0;
 return (up-down)*(right-left);
}
int main()
{
 scanf("%d",&n);
 for(int i=1;i<=n;i++)
 {
  ll x,y,h,w;
  scanf("%d%lld%lld%lld%lld",&a[i].p,&x,&y,&w,&h);
  a[i].u=y+h;
  a[i].d=y-h;
  a[i].l=x-w;
  a[i].r=x+w;
  a[i].x=i;
  a[i].s=4*h*w;
 }
 sort(a+1,a+n+1,cmp);
 while(a[n].p<600000)
  n--;
 for(int i=1;i<=n;i++)
 {
  if(a[i].flag)
   continue;
  ans[++top]=a[i].x;
  for(int j=i+1;j<=n;j++)
  {
   if(a[j].flag)
    continue;
   ll s=calc(i,j);
   if(2*s>a[i].s+a[j].s-s)
    a[j].flag=1;
  }
 }
 sort(ans+1,ans+top+1);
 for(int i=1;i<=top;i++)
   printf("%d ",ans[i]);
 printf("\n");
 return 0;
}

来源:zr

猜你喜欢

转载自blog.csdn.net/qq_42500298/article/details/82845131