poj 3067 Japan 二維樹狀陣列(入門)

2021-06-17 15:41:37 字數 1122 閱讀 6619

/**

* 二維樹狀陣列(入門):

* 二維樹狀陣列直接上就行了。。。

* 用結構體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...