這乙個題目是求乙個區間內重複數字的最大次數。
這題有乙個特點,數字是遞增滴,相同的數字肯定是連續的。
將相同的數字看做乙個部分,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號士兵的總殺敵數,請你幫助小工來回答南將軍吧。注意,南將軍可能會問很多次問題。輸入 只有一...