HDOJ 题目3465 Life is a Line(树状数组求逆序对,第二种写法)
2014-12-17 15:14
411 查看
Life is a Line
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 1706 Accepted Submission(s): 389
Problem Description
There is a saying: Life is like a line, some people are your parallel lines, while others are destined to meet you.
Maybe have met, maybe just a matter of time, two unparallel lines will always meet in some places, and now a lot of life (i.e. line) are in the same coordinate system, in a given open interval, how many pairs can meet each other?
Input
There are several test cases in the input.
Each test case begin with one integer N (1 ≤ N ≤ 50000), indicating the number of different lines.
Then two floating numbers L, R follow (-10000.00 ≤ L < R ≤ 10000.00), indicating the interval (L, R).
Then N lines follow, each line contains four floating numbers x1, y1, x2, y2 (-10000.00 ≤ x1, y1, x2, y2 ≤ 10000.00), indicating two different points on the line. You can assume no two lines are the same one.
The input terminates by end of file marker.
Output
For each test case, output one integer, indicating pairs of intersected lines in the open interval, i.e. their intersection point’s x-axis is in (l, r).
Sample Input
3
0.0 1.0
0.0 0.0 1.0 1.0
0.0 2.0 1.0 2.0
0.0 2.5 2.5 0.0
Sample Output
1
Author
iSea @ WHU
Source
2010 ACM-ICPC Multi-University
Training Contest(3)——Host by WHU
Recommend
zhouzeyong | We have carefully selected several similar problems for you: 3461 3467 3468 3464 3462
刚刚写完一篇博客,仔细有想了一下下,瞬间觉悟,知道哪错了
第二种ac代码
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; struct s { double a,b; int num; }c[50010]; int cmp1(s x,s y) { if(x.a==y.a) return x.b<y.b; return x.a<y.a; } int cmp2(s x,s y) { if(x.b==y.b) return x.a<y.a; return x.b<y.b; } int d[50010],t; int low(int x) { return x&(-x); } void add(int p,int q) { while(p<=t) { d[p]+=q; p+=low(p); } } int sum(int p) { int ans=0; while(p>0) { ans+=d[p]; p-=low(p); } return ans; } int cot[100010]; int main() { int n; while(scanf("%d",&n)!=EOF) { double l,r; int i,tt=0,ans=0; t=0; scanf("%lf%lf",&l,&r); for(i=0;i<n;i++) { double x1,x2,y1,y2,k,bn; scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); if(x1==x2) { if(x1<r&&x1>l) tt++; continue; } k=(y1-y2)/(x1-x2); bn=y1-k*x1; c[t].a=k*l+bn; c[t++].b=k*r+bn; } sort(c,c+t,cmp1); for(i=0;i<t;i++) { c[i].num=i+1; } sort(c,c+t,cmp2); memset(d,0,sizeof(d)); memset(cot,0,sizeof(cot)); for(i=0;i<t;i++) { cot[c[i].num]=i+1; } for(i=1;i<=t;i++) { add(cot[i],1); ans+=i-sum(cot[i]); } /*for(i=0;i<t;i++) { add(c[i].num,1); ans+=sum(c[i].num-1); }*/ printf("%d\n",ans+tt*t); } }
相关文章推荐
- HDOJ 题目3465 Life is a Line(树状数组求逆序对)
- HDU 3465 Life is a Line 树状数组求逆序数
- hdu 3465 Life is a Line 树状数组求逆序数
- hdu 3465 Life is a Line(树状数组求逆序对)
- hdu 3465 Life is a Line 树状数组求逆序数
- HDU 3465 Life is a Line (逆序数 + 数状数组)
- HDU3465--Life is a Line(树状数组求逆序数,离散化)
- HDOJ题目1541 Stars(树状数组单点更新)
- HDOJ 题目1754 I Hate It(树状数组,单点更新,求区间最大值)
- HDOJ 题目1166 敌兵布阵(树状数组单点跟新)
- HDOJ 题目4046 Panda(树状数组)
- HDOJ 题目2227 Find the nondecreasing subsequences(树状数组,离散化,DP)
- HDOJ 题目1166敌兵布阵(树状数组)
- HDOJ 题目2838 Cow Sorting(树状数组逆序对)
- hdu 3465 Life is a Line
- HDU 3465 Life is a Line 逆序数
- HDOJ 题目1556Color the ball(树状数组)
- HDOJ 题目4000 Fruit Ninja(树状数组)
- HDU - 3465 Life is a Line
- HDU - 3465 Life is a Line