您的位置:首页 > 其它

Uva1398 Meteor

2016-11-13 18:25 399 查看

扫描线法。

将流星出现在相机里的时间转化成线段,离散化端点后,扫描何时出现的流星最多。注意边界的不算,所以要先减右端点再加左端点

 

 

/*By SilverN*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int mxn=100010;
int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int T;
int n,w,h;
struct node{
int v,t;
}c[mxn<<1];int cnt=0;
int cmp(node a,node b){
if(a.v==b.v)return a.t>b.t;
return a.v<b.v;
}
//int h1[mxn],h2[mxn],w1[mxn],w2[mxn];
int L,R;
void init(int a,int x,int w){
if(!a){ if(x<=0 || x>=w)R=L-1; }
else if(a>0){
L=max(L,-x*2520/a);
R=min(R,(w-x)*2520/a);
}
else{
L=max(L,(w-x)*2520/a);
R=min(R,-x*2520/a);
}
return;
}
int main(){
T=read();
int i,j;
int x,y,a,b;
while(T--){
cnt=0;//init
w=read();h=read();n=read();
for(i=1;i<=n;i++){
x=read();y=read();a=read();b=read();
L=0,R=0x7f7f7f7f;
init(a,x,w);init(b,y,h);
if(R>L){
c[++cnt].v=L;c[cnt].t=0;
c[++cnt].v=R;c[cnt].t=1;
}
}
sort(c+1,c+cnt+1,cmp);
int ans=0,ct=0;
for(i=1;i<=cnt;i++){
if(!c[i].t){//进入
++ct;
ans=max(ans,ct);
}
else --ct;
}
printf("%d\n",ans);
}
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: