題意:
日本西海岸有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...