题意:

给出n颗流星,第i颗在第T秒时飞到(xi+ai*t,yi+bi*t),给出一个矩形,问在某一时刻这个矩形中的流星数目最多有多少

题解:

首先计算出每一颗流星经过时间

然后左端点移动,计算出少了一颗流星还是多了一颗流星

代码:

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=200005;
double A[N];
int x,y,a,b,n,T,w,h,tot,B[N],F[N];
int cmp(int x,int y)
{
    if (A[x]==A[y])return B[x]<B[y];
    return A[x]<A[y];
}
void update(int x,int a,int w,double& L,double& R)
{
   if(a==0){if(x<=0||x>=w)R=L-1;}
   else if(a>0)
    {
      L=max(L,-(double)x/a);
      R=min(R,(double)(w-x)/a);
    }
   else
    {
      L=max(L,(double)(w-x)/a);
      R=min(R,-(double)x/a); 
    }         
}
int main()
{
    scanf("%d",&T);
    while (T--)
     {
         scanf("%d%d%d",&w,&h,&n);
         tot=0;
         while (n--)
          {
              double t1=0,t2=1e9;
              scanf("%d%d%d%d",&x,&y,&a,&b);
              update(x,a,w,t1,t2);
              update(y,b,h,t1,t2);
              if (t1>=t2)continue;
              A[++tot]=t1;B[tot]=1;F[tot]=tot;
              A[++tot]=t2;B[tot]=-1;F[tot]=tot;
          }
         sort(F+1,F+tot+1,cmp);
         int now=0,q=0;
        for (int i=1;i<=tot;i++)
         {
             now+=B[F[i]];
             q=max(now,q);
         } 
        printf("%d\n",q); 
     }
}

 

posted on 2017-11-18 22:15  宣毅鸣  阅读(215)  评论(0编辑  收藏  举报