ZOJ 3157 求逆序对

一开始的想法很简单,本想求出所有直线的交点,然后判断;结果一开数据量10000,超时啊!好吧,用了逆序对。

将每条直线与L和R的的交点求出,分别放在结构体数组的P的下,x和y中,然后根据题意就是求线段的交点个数,也就是求

结构体数组的逆序对的个数。

复制代码
View Code
 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<stdlib.h>
 4 #define N 10001
 5 
 6 typedef struct 
 7 {
 8    double x,y;
 9 }Node;
10 Node p[N];   
11 long long count;
12 double a[N],b[N],c[N],d[N],k[N];
13 double l,r;
14 
15 void Mergerarray(int first, int mid, int last)
16 {
17     int i,j,k;            
18     int n1 = mid - first + 1;
19     int n2 = last - mid;
20     double L[n1+1],R[n2+1];  
21     
22     for(i=0; i<n1; i++)   
23       L[i] = p[first + i].y; 
24     for(j=0; j<n2; j++)
25       R[j] = p[mid + 1 + j].y; 
26       
27      i = j = 0;
28      L[n1] = 1.7e+300;
29      R[n2] = 1.7e+300;
30      for(k = first; k <= last; k++)
31      {
32          if(L[i] <= R[j])
33          {
34             p[k].y = L[i++];
35          }
36          else
37          {
38              count += (long long)(n1-i); 
39              p[k].y = R[j++];
40           }
41      } 
42 
43 }
44 
45 void Mergersort(int first, int last)
46 {
47      int mid;
48      
49      if(first < last)
50      {
51         mid = (first + last)/2;       
52         Mergersort(first, mid);
53         Mergersort(mid+1, last);
54         Mergerarray(first, mid, last);
55      }   
56 }
57 
58 int cmp(const void *a, const void *b)
59 {
60      if( ((Node *)a)->x  > ((Node *)b)->x )
61         return  1;  
62      else if( fabs( ((Node *)a)->x-((Node *)b)->x) < 0.00000001 && ((Node *)a)->y > ((Node *)b)->y)
63        return 1;    
64     return -1;        
65          
66 }
67 
68 int main()
69 {
70     int i,j,ncases;
71     
72     while(scanf("%d",&ncases) != EOF)
73     {
74         for(i = 0; i < ncases; i++)
75         {
76           scanf("%lf%lf%lf%lf",&a[i],&b[i],&c[i],&d[i]);
77           k[i] = (d[i]-b[i])/(c[i]-a[i]);
78         } 
79         scanf("%lf%lf",&l,&r);
80         for(i = 0; i < ncases; i++)
81         {      
82            p[i].x = k[i]*(l-a[i])+b[i];       
83            p[i].y = k[i]*(r-a[i])+b[i]; 
84         }
85         count = 0LL;
86         qsort(p,ncases,sizeof(Node),cmp);
87         
88         Mergersort(0,ncases-1);
89       
90        printf("%lld\n",count); 
91     }
92     
93     return 0;
94 }   
复制代码

坐标转化好以后使用归并排序的模板直接套上就可以了。

 

posted @   zhongya  阅读(200)  评论(0编辑  收藏  举报
编辑推荐:
· ASP.NET Core - 日志记录系统(二)
· .NET 依赖注入中的 Captive Dependency
· .NET Core 对象分配(Alloc)底层原理浅谈
· 聊一聊 C#异步 任务延续的三种底层玩法
· 敏捷开发:如何高效开每日站会
阅读排行:
· 终于决定:把自己家的能源管理系统开源了!
· C#实现 Winform 程序在系统托盘显示图标 & 开机自启动
· 了解 ASP.NET Core 中的中间件
· 实现windows下简单的自动化窗口管理
· 【C语言学习】——命令行编译运行 C 语言程序的完整流程
历史上的今天:
2011-08-16 CUGB 1050 题解动态规划简单题,这是我学会动态规划后做的第三道题比起前两道明显要顺手的多!秩序套用一下代码末班就行了。
2011-08-16 CUGB 1032 DP简答题,有了前面的教训,这道题做起来顺手多了,不过还是遇到点小麻烦,好在都解决了。此题很容易误认为只须求一次最大上升子序列。殊不知上了山后还要再下来!
2011-08-16 CUGB 1009 DP简单动态规划,此题一开始就结了很久,WA了9次对于刚开始学DP的我打击很大,最后发现原来是方法弄错了,题意没完全弄懂!看了大牛的文章才知道,差距啊!还得好好努力。
点击右上角即可分享
微信分享提示