POJ3067 Japan 歸併排序

2021-07-10 23:34:35 字數 1178 閱讀 9952

題意:

日本西海岸有n座城市,東海岸m座城市。現在要在兩個海岸的城市之間建高速公路,問有幾個相交點。

要點:對ax,ay和bx,by兩條高速公路,有相交點必須(ax-bx)*(ay-by)<0,所以我們只要先按照x從小到大排序,然後再求y中的逆序對即可。因為同乙個城市是不算的如:3,1和3,2不相交。所以x排序時只要相同的把y較小的放到前面即可,這樣後面求逆序對時就不會算了。這題有個比較坑的地方是資料其實是1e6的,所以一定要用long long。

void merge_sort(int a,int x,int y,int t)//注意這裡[x,y),y是取不到的

for (i = x; i < y; i++)

a[i] = t[i]; //從臨時空間複製回a陣列

}}

15357610

seasonal

3067

accepted

5360k

563ms

c++1128b

2016-04-05 22:06:43

#include#include#include#include#define maxn 1000050

using namespace std;

struct node

a[maxn];

long long cnt; //注意這裡其實資料是1e6,所以用long long

int c[maxn],b[maxn];

bool cmp(const node &a, const node &b)

void merge_sort(int a, int x, int y, int t)//注意這裡[x,y),y是取不到的

} for (i = x; i < y; i++)

a[i] = t[i]; //從臨時空間複製回a陣列 }}

int main()

sort(a, a + k, cmp);

for (int i = 0; i < k; i++)

c[i] = a[i].y;

cnt = 0;

merge_sort(c, 0, k, b);

printf("test case %d: %lld\n",j,cnt);

} return 0;

}

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...