1107 斜率小於0的連線數量

2021-08-14 06:06:55 字數 1441 閱讀 4799

二維平面上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 <= x[i], y[i] <= 10^9)

output

輸出斜率小於0的連線的數量。(2,3) (2,4)以及(2,3) (3,3)這2種情況不統計在內。
input示例

4

2 33 4

1 54 6

output示例

2

題解:先維護公升序的y,進行離散化。以公升序x,相同x的情況則公升序y排序。然後遍歷n個點,每次在bit中查詢小於等於該點y值對應離散化的值的數量,因為是由x公升序遍歷的,所以找到的數量是不符合要求的那部分,用ans減去。將該點y值對應離散化的值維護進bit。ans初始化為c(n,2)。最終的ans便是答案。

**:#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

typedef pairp;

const int inf = 0x3f3f3f3f;

const ll linf = 0x3f3f3f3f3f3f3f3f;

const double pi = acos(-1.0);

const double eps = 1e-10;

const int maxn = 5e4+7;

const int mod = 1e9+7;

int n;

struct g

g(){}

}s[maxn];

int d[maxn];

ll b[maxn];

void ins(int v)

}ll sum(int v)

return res;

}bool cmp1(g a,g b){

return a.y==b.y?a.x

1、離散化。

2、bit。

總結:一開始想的的二分,後來是線段樹+離散化,最後才用了bit。相對來說,在處理求字首問題上用bit更加簡單方便。

好久沒打bit,差點記錯。

(x&-x):取出x的二進位制的最後乙個1。

x = x-(x&-x):bit的求和。

x = x+(x&-x):上一步相反,bit插入。

1107 斜率小於0的連線數量

二維平面上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為...

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

二維平面上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個點之間共有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為...