/**
* 二維樹狀陣列(入門):
* 二維樹狀陣列直接上就行了。。。
* 用結構體line存完輸入資料後,按照x從小到大排序。
* 遍歷一遍,每次加完crossing數後在更新維護二維樹狀陣列。
* 這類題關鍵在如何用get_sum(),就是對「面積區間」(按個人理解自己取的名)的正確選取
* 仔細考慮邊界情況,是否減一加一。
* 本題:ans += get_sum(lines[i].x - 1, y) - get_sum(lines[i].x, lines[i].y)
* 因為算當前路線(lines[i])與之前路線的交叉口(crossing)時,是之前路線在x之前(不包括x,也就是x-1開始的)
* 和最南邊的城市y. 所以要先用(lines[i].x - 1, y) 減去 (lines[i].x - 1, lines[i].y)
* 其他就還有個資料型別要用 __int64的。
*/#include #include #include #include #include #define inf 0x7fffffff
#define maxs 1000005
#define ll __int64
using namespace std;
struct line
} lines[maxs];
ll c[1010][1010];
int t, n, m, k;
int lowbit(int x)
ll get_sum(int x, int y)
}return ret;
}void update(int x, int y)
}}void init(int x, int y)
int main()
sort(lines + 1, lines + k + 1);
ll ans = 0;
for(int i = 1; i <= k; i ++)
printf("test case %d: %i64d\n", curcase, ans);
}return 0;
}
POJ 3067 Japan 二維樹狀陣列
是乙個比較不錯的題目。題目大意是,在一張地圖上,西邊從上到下均勻排了一列點,東邊也是這樣,然後給出若干個邊,都是從西邊的點連到東邊的點上。問最後這些邊的交點,所謂交點,就是兩個邊交叉得到的交點,如果交點在結點上,是不算數的。首先思考一下基本做法,很容易想到,跟某條邊相交的邊數,跟其在東邊和西邊的編號...
POJ 3067 Japan 二維樹狀陣列
是乙個比較不錯的題目。題目大意是,在一張地圖上,西邊從上到下均勻排了一列點,東邊也是這樣,然後給出若干個邊,都是從西邊的點連到東邊的點上。問最後這些邊的交點,所謂交點,就是兩個邊交叉得到的交點,如果交點在結點上,是不算數的。首先思考一下基本做法,很容易想到,跟某條邊相交的邊數,跟其在東邊和西邊的編號...
POJ 3067 Japan 線段樹 轉化
poj 3067 japan 線段樹 轉化 題意 有一幅圖,左邊m個結點,右邊n個結點,給出k條邊連線左邊結點和右邊結點 求這些邊相互交叉的個數,乙個點只會有兩條邊經過 思路 同樣將線段轉化成點然後放在二維平面圖上,對於兩條線段 si,ei sj,ej 滿足交叉的條件是siej si sj ei i...