高效 NKOJ 4251 直線的交點

2021-08-09 01:39:49 字數 1149 閱讀 1311

問題描述

倫倫剛剛在高中學習了解析幾何,學會了計算兩條直線的交點。這天,老師給她布置了一道作業。在平面上有 n 條直線,他們之間有若干交點。給定一對平板(兩條平行的直線),問這有多少對直線,他們的交點在這一對平板之間(注意 (i, j) 和 (j, i) 只算一對)。

輸入格式

第一行三個整數 k,a,b 表示平板的兩條平行直線的方程為 y=kx+a 和 y=kx+b,保證 a

輸出格式

乙個整數,表示有多少對直線,他們的交點在平板之間。

樣例輸入

0 3 50

51 0

2 0-1 0

-2 0

-1 10

樣例輸出3

題解:

本題是逆序對的基本應用。

我們要用到以下觀察,若兩條直線的交點在平板內部。則他們與下方平板和上方平板的交點橫座標大小關係相反。

這表明,如果將所有直線按照他們與下方平板的交點的橫座標排序,將他們上方平板交點的橫座標作為關鍵字。則平板內交點個數等於在排序後的序列中關於關鍵字的逆序對個數.

#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef double db;

const int maxn=100001;

int res=0,n,k,a,b;

struct line

else

}while(i<=mid)

while(j<=r)

for(int ptr=l;ptr<=r;ptr++) }

void merge_sort(int l,int r)

}int main()

stable_sort(data+1,data+1+n);

merge_sort(1,n);

printf("%d",res);

return 0;

}

求兩直線的交點

一般方程法 直線的一般方程為f x ax by c 0。既然我們已經知道直線的兩個點,假設為 x0,y0 x1,y1 那麼可以得到a y0 y1,b x1 x0,c x0y1 x1y0。因此我們可以將兩條直線分別表示為 f0 x a0 x b0 y c0 0,f1 x a1 x b1 y c1 0 ...

計算直線的交點數

time limit 1 sec memory limit 64 mb submit 820 solved 518 平面上有n條直線,且無三線共點,問這些直線能有多少種不同交點數。比如,如果n 2,則可能的交點數量為0 平行 或者1 不平行 輸入資料報含多個測試例項,每個測試例項佔一行,每行包含乙個...

OJ 計算直線的交點數

平面上有n條直線,且無三線共點,問這些直線能有多少種不同交點數。比如,如果n 2,則可能的交點數量為0 平行 或者1 不平行 輸入資料報含多個測試例項,每個測試例項佔一行,每行包含乙個正整數n n 20 n表示直線的數量。每個測試例項對應一行輸出,從小到大列出所有相交方案,其中每個數為可能的交點數,...