PKU2036

对线段排序 对于K不存在的线段的放在一起,对x1进行排序 对于x1相同的对于y1排序
对于K存在的直线 对b进行排序 b相同的对于x1进行排序
排序复杂度Nlogn  在对于在一条直线上的线段O(n)的计算线段数目
总时间复杂度NLOGN这应该是这题最基本的算法

None.gif #include  < stdio.h >
None.gif#include 
< string .h >
None.gif#include 
< stdlib.h >
None.gif#include 
< math.h >
None.gif
None.gif
struct  line
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
double x1, y1, x2, y2;
InBlock.gif    
double b, k;
InBlock.gif    
bool ex_k;
ExpandedBlockEnd.gif}
;
None.gif
None.gifline l[
10000 ];
None.gif
int  result;
None.gif
int  cnt;
None.gif
None.gif
void  func( int  begin,  int  end)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int i;
InBlock.gif    
int c=0;
InBlock.gif    
double back_x, back_y;
InBlock.gif    
for(i = begin; i <= end; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if(l[i].ex_k)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if(i == begin || back_x < l[i].x1)
InBlock.gif                c
++;
InBlock.gif            
if(i == begin || back_x < l[i].x2)
InBlock.gif                back_x
=l[i].x2;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
else
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if(i == begin || back_y < l[i].y1)
InBlock.gif                c
++;
InBlock.gif            
if(i == begin || back_y < l[i].y2)
InBlock.gif                back_y
=l[i].y2;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    result 
+= c;
ExpandedBlockEnd.gif}

None.gif
None.gif
bool  eq( const   double  a,  const   double  b)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
if(fabs(a-b)<0.00000001)
InBlock.gif        
return 1;
InBlock.gif    
else
InBlock.gif        
return 0;
ExpandedBlockEnd.gif}

None.gif
None.gif
int  cmp1( const   void   *  a,  const   void   *  b)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    line 
* aa = (line *)a;
InBlock.gif    line 
* bb = (line *)b;
InBlock.gif    
if(aa->ex_k != bb->ex_k )
InBlock.gif        
return aa->ex_k > bb->ex_k ? 1 : -1;
InBlock.gif    
else 
InBlock.gif        
if(aa->ex_k && bb->ex_k)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if(!eq(aa->k , bb->k))
InBlock.gif                
return aa->> bb->? 1 : -1;
InBlock.gif            
else
InBlock.gif                
if(!eq(aa->b , bb->b))
InBlock.gif                    
return aa->> bb->? 1 : -1;
InBlock.gif                
else
InBlock.gif                    
return aa->x1 > bb->x1 ? 1 : -1;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
else
InBlock.gif            
if(!eq(aa->x1 , bb->x1))
InBlock.gif                
return aa->x1 > bb->x1 ? 1 : -1;
InBlock.gif            
else
InBlock.gif                
return aa->y1 > bb->y1 ? 1 : -1;
ExpandedBlockEnd.gif}

None.gif
None.gif
int  main()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int n;
InBlock.gif    
while(scanf("%d"&n) == 1 && n)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        result 
= 0;
InBlock.gif        cnt 
= 0;
InBlock.gif        memset(l,
0,sizeof(l));
InBlock.gif        
int i;
InBlock.gif        line ll;
InBlock.gif        
for(i = 0; i < n; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            scanf(
"%lf%lf%lf%lf"&l[i].x1, &l[i].y1, &l[i].x2, &l[i].y2);
InBlock.gif            
if(l[i].x1==l[i].x2)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                l[i].ex_k
=0;
InBlock.gif                
if(l[i].y1 > l[i].y2)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
double temp=l[i].x1;
InBlock.gif                    l[i].x1
=l[i].x2;
InBlock.gif                    l[i].x2
=temp;
InBlock.gif                    temp
=l[i].y1;
InBlock.gif                    l[i].y1
=l[i].y2;
InBlock.gif                    l[i].y2
=temp;
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                l[i].ex_k
=1;
InBlock.gif                
if(l[i].x1 > l[i].x2)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
double temp=l[i].x1;
InBlock.gif                    l[i].x1
=l[i].x2;
InBlock.gif                    l[i].x2
=temp;
InBlock.gif                    temp
=l[i].y1;
InBlock.gif                    l[i].y1
=l[i].y2;
InBlock.gif                    l[i].y2
=temp;
ExpandedSubBlockEnd.gif                }

InBlock.gif                l[i].k
=(l[i].y2-l[i].y1)/(l[i].x2-l[i].x1);
InBlock.gif                l[i].b
=l[i].y1-l[i].x1*(l[i].y2-l[i].y1)/(l[i].x2-l[i].x1);            
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        qsort(l, n , 
sizeof(l[0]), cmp1);
InBlock.gif
InBlock.gif        
int begin = 0, end = 0;
InBlock.gif        
for(i = 0; i < n; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if(i == n-1 || l[i].ex_k != l[i+1].ex_k || !l[i].ex_k&&!eq(l[i].x1 , l[i+1].x1) || !eq(l[i].k , l[i+1].k) || !eq(l[i].b , l[i+1].b) )
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                end 
= i;
InBlock.gif                func(begin, end);
InBlock.gif                begin 
= i+1;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif        printf(
"%d\n", result);
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif    
return 0;
ExpandedBlockEnd.gif}

转载于:https://www.cnblogs.com/SQL/archive/2007/10/25/937155.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值