码迷,mamicode.com
首页 > 其他好文 > 详细

uvaliva3905(扫描线)

时间:2017-04-18 18:50:21      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:ref   logs   1.0   log   max   return   class   main   scan   

题目链接: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(扫描线)

标签:ref   logs   1.0   log   max   return   class   main   scan   

原文地址:http://www.cnblogs.com/yijiull/p/6728842.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!