poj 3368 又一線段樹

2021-06-05 02:32:48 字數 1212 閱讀 8713

這乙個題目是求乙個區間內重複數字的最大次數。

這題有乙個特點,數字是遞增滴,相同的數字肯定是連續的。

將相同的數字看做乙個部分,hash儲存每個數字屬於哪個部分。對所有的部分建一顆二叉樹,儲存此區間內最大的重複數字的個數。

查詢的時候分3中情況

1 在同乙個部分,直接 尾 - 頭 + 1就是結果

2 只差乙個部分,分開算,在各個部分裡面重複多少次,比較一下

3 中間有很多個部分,那麼可以先根據2計算出兩頭的,在通過二叉樹查詢最大的重複數字個數

// segment tree

#include using namespace std;

int arr[100010],hash[100010];

struct part

part[100010];

struct node

node[1000001];

int max(int a, int b)

void build(int l, int r, int u)

int mid = (l + r) >> 1;

build(l, mid, 2 * u);

build(mid + 1, r, 2 * u + 1);

node[u].num = max(node[2 * u].num , node[2 * u + 1].num );

}int query(int l, int r, int u)

int mid = (node[u].l + node[u].r)>> 1;

if (r <= mid)//all in left child tree

else if (l > mid)//all in right child tree

else }

int main()

memset(part, 0, sizeof(part));

int id = 1;

part[1].s = id;

for (int i = 1; i <= n; ++ i)

}build(1, id - 1, 1);

int a, b;

while (q --)

else// two situations

printf("%d\n", max(max(n1, n2),n3));

}} }

return 0;

}

線段樹 區間合併 poj3368

poj 3368 frequent values 題意 給乙個單調不遞減的數列,求給定區間內重複最多數字的次數 用線段樹進行維護的話,要記錄五個值 區間左邊界的數字,區間左邊界在本區間內的次數,區間右邊界的數字 區間右邊界在本區間內的次數,該區間內出現的最大次數 在用線段樹維護的時候,不能只對左右區...

nyoj108 士兵殺敵(一) (線段樹)

描述南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍現在想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。注意,南將軍可能會問很多次問題。輸入 只有一組測試資料 第一行是兩個整數n,m,其中n表示士兵的個數 1 輸出對於每乙個詢問,輸出總...

NYOJ 108 士兵殺敵(一)(線段樹)

link 點我點我 時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍現在想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。注意,南將軍可能會問很多次問題。輸入 只有一...