1. 程式人生 > >51Nod - 1107 斜率小於0的連線數量

51Nod - 1107 斜率小於0的連線數量

sort input http -1 n+1 inpu string -m tool

二維平面上N個點之間共有C(n,2)條連線。求這C(n,2)條線中斜率小於0的線的數量。

二維平面上的一個點,根據對應的X Y坐標可以表示為(X,Y)。例如:(2,3) (3,4) (1,5) (4,6),其中(1,5)同(2,3)(3,4)的連線斜率 < 0,因此斜率小於0的連線數量為2。

Input第1行:1個數N,N為點的數量(0 <= N <= 50000)
第2 - N + 1行:N個點的坐標,坐標為整數。(0 <= Xii , Yii <= 10^9)Output輸出斜率小於0的連線的數量。(2,3) (2,4)以及(2,3) (3,3)這2種情況不統計在內。Sample Input

4
2 3
3 4
1 5
4 6

Sample Output

2

選x或y,維護另一個的樹狀數組即可。

技術分享
 1 #include<iostream www.qwangxiao.com/k/gzwxkc/>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 
 6 using namespace std;
 7 
 8 const int maxn=60005;
 9 int g[maxn],n;
10 
11 struct node
12 {
13     int x,y;
14     int y1;
15 }c[maxn];
16 
17 void update(int x)
18 {
19     for(;x<=n;x+=x&(-x))
20         g[x]++;
21 }
22 
23 int getsum(int x)
24 {
25     int sum=0;
26     for(;x>0;x-=x&(-x))
27         sum+=g[x];    
28     return sum;
29 }
30 
31 bool cmpx(node xx,node yy)
32 {
33     if(xx.x!=yy.x)
34         return xx.x<yy.x;
35     return xx.y<yy.y;
36 }
37 
38 bool cmpy(node xx,node yy)
39 {
40     if(xx.y!=yy.y)
41         return xx.y<yy.y;
42     return xx.x<yy.x;
43 }
44 
45 int main()
46 {
47     scanf("%d",&n);
48     for(int i=1;i<=n;i++)
49         scanf("%d%d",&c[i].x,&c[i].y);
50 
51     sort(c+1,c+n+1,cmpy); 
52     for(int i=1;i<=n;i++)
53         c[i].y1=n-i+1;
54     sort(c+1,c+n+1,cmpx);
55     memset(g,0,sizeof(g));
56     long long ans=0;
57     for(int i=1;i<=n;i++)
58     {
59         ans+=getsum(c[i].y1);
60         update(c[i].y1);
61     }
62     printf("%lld\n",ans);
63     
64     
65     return 0;    
66 } 
技術分享

51Nod - 1107 斜率小於0的連線數量