poj 3067 Japan(樹狀陣列)

2021-08-03 23:20:41 字數 836 閱讀 3643

題目大意:給出t個樣例

每個樣例給出n個左邊的點 m個右邊的點 k條左邊點連右邊點的線

問最多有幾個交點,每個交點最多有兩條線經過

思路:

一:總體的思路

先來分析下什麼樣的情況兩條線會有交點:即相交的情況必然是在在lirj

所以我們先按照左邊的由小到大的順序排序,在對每條線查詢右邊點比他的個數

二:排序

struct node

{ int s,e;

bool operator <(const node &tmp)const

{ if(s==tmp.s)return e

即左邊先按由小到大的順序,當左邊相等時,右邊按由小到大的順序.

因為,當左邊點相等時,這兩條線必定不可能相交,為了排除這種情況,當左邊點相同時,讓右邊點小的先出現,這樣就不會將左邊點相同右邊點比他大的直線記錄進去!!

還有需要注意的是:

ret+=i-getsum(id);  因為是大於他的個數,所以轉化為當前條數減去小於等於他的條數.

還有本題資料較大,需要將結果設為long long

#include#include#include#includeusing namespace std;

const int maxn =1000010;

struct node

{ int s,e;

bool operator <(const node &tmp)const

{ if(s==tmp.s)return e

poj 3067 japan 樹狀陣列

poj3067 japan 這裡求的是高架橋交叉的個數,首先按照規則排序,然後同上處理 這裡要注意的是 輸入輸出要用scanf 且要用sum 要用 int64 include include include define maxn 2005 define max 1000010 using name...

POJ 3067 Japan 樹狀陣列

題意 兩邊都有一些城市,從上到下排列,有些城市之間有路,路與路之間會形成交點,問最後會形成多少個交點。思路 首先可以把有聯絡的城市轉化成平面上的點,比如說1 和 2 之間有一條路,則代表有乙個點,座標為 1,2 轉化之後可以用樹狀陣列做,可以發現最後的結果其實和所給的順序無關,因此我們可以按y軸從小...

樹狀陣列 POJ 3067 Japan

樹狀陣列的典型應用,典型輸入如下 13 4 4 1 42 3 3 23 1 表示有4條連線,如圖 顯然有5個交點。怎麼求呢?對輸入的數對 x,y 做排序,先按x公升序排,x相等按y公升序排,然後對y做樹狀陣列,每次更新檢查在他後面有多少個元素即可。include include using name...