首页 > 代码库 > uvaliva3905(扫描线)

uvaliva3905(扫描线)

题目链接:https://vjudge.net/problem/UVALive-3905

 

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn=100010;
 5 void update(int x,int a,int w,double &l,double &r)
 6 {
 7     if(a==0)
 8     {
 9         if(x<=0||x>=w) r=l-1;
10     }
11     else if(a>0)
12     {
13         l=max(l,-x*1.0/a);
14         r=min(r,(w-x)*1.0/a);
15     }
16     else {
17         l=max(l,(w-x)*1.0/a);
18         r=min(r,-x*1.0/a);
19     }
20 }
21 struct event
22 {
23     double x;
24     int tp;
25     bool operator< (const event &a) const {
26         return x<a.x||(x==a.x&&tp>a.tp);  //先处理右端点
27     }
28 }eve[maxn<<1];
29 int main()
30 {
31     int t;
32     scanf("%d",&t);
33     while(t--)
34     {
35         int w,h,n,e=0;
36         scanf("%d%d%d",&w,&h,&n);
37         for(int i=0;i<n;i++)
38         {
39             int x,y,a,b;
40             scanf("%d%d%d%d",&x,&y,&a,&b);
41             double l=0,r=1e9;
42             update(x,a,w,l,r);
43             update(y,b,h,l,r);
44             if(r>l)
45             {
46                 eve[e++]=(event){l,0};
47                 eve[e++]=(event){r,1};
48             }
49         }
50         sort(eve,eve+e);
51         int cnt=0,ans=0;
52         for(int i=0;i<e;i++)
53         {
54             if(eve[i].tp==0) ans=max(ans,++cnt);
55             else cnt--;
56         }
57         printf("%d\n",ans);58     }
59 }

 

uvaliva3905(扫描线)