LA3905

Posted 宣毅鸣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LA3905相关的知识,希望对你有一定的参考价值。

题意:

给出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); 
     }
}

 

以上是关于LA3905的主要内容,如果未能解决你的问题,请参考以下文章

POJ 3905 Perfect Election(2-sat)

bzoj3905: Square

uvaliva3905(扫描线)

bzoj3905: Square

[2016-03-20][UVALive][3905][Meteor]

洛谷——P3905 道路重建