首页 > 代码库 > 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(扫描线)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。