P4392 BOI2007 Sound 靜音問題

2022-09-24 06:03:13 字數 1098 閱讀 5685

本題其實可以拆解程兩個問題,求區間最大值、求區間最小值。

而這兩個操作都必須在 \(o(\log n)\) 內完成。

自然想到線段樹。

線段樹需要維護兩個資訊:區間最大值、區間最小值。

輸入完資料後,建樹。然後遍歷序列,求區間最大值最小值之差,再判斷是否大於 \(c\) 就可以了。

記得立乙個 \(flag\) 方便記錄是否有解。(很重要)。

考場**如下:

#include using namespace std;

int n, m, c, a[1000005];

int maxn[1000005 << 2], minn[1000005 << 2];

bool flag = true;

void pushup(int i)

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

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

build(i << 1, l, mid);

build(i << 1 | 1, mid + 1, r);

pushup(i);

}int querymax(int l, int r, int l, int r, int i)

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

int result = int_min;

if (l <= mid)

if (r > mid)

return result;

}int querymin(int l, int r, int l, int r, int i)

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

int result = int_max;

if (l <= mid)

if (r > mid)

return result;

}int main()

build(1, 1, n);

for (int i = 1; i <= n - m + 1; i++) {

//cout《由於線段樹自帶大常數,在cy的 老舊 機器跑不過,只能跑 \(93\) 分。但是在洛谷上是能 \(ac\) 的。

正解單調佇列不打

P4392 BOI2007 Sound 靜音問題

數字錄音中,聲音是用表示空氣壓力的數字序列描述的,序列中的每個值稱為乙個取樣,每個取樣之間間隔一定的時間。很多聲音處理任務都需要將錄到的聲音分成由靜音隔開的幾段非靜音段。為了避免分成過多或者過少的非靜音段,靜音通常是這樣定義的 m個取樣的序列,該序列中取樣的最大值和最小值之差不超過乙個特定的閾值c。...

BOI2007 Sequence 序列問題

對於乙個給定的序列a1,an,我們對它進行乙個操作reduce i 該操作將數列中的元素ai和ai 1用乙個元素max ai,ai 1 替代,這樣得到乙個比原來序列短的新序列。這一操作的代價是max ai,ai 1 進行n 1次該操作後,可以得到乙個長度為1的序列。我們的任務是計算代價最小的redu...

BOI2007 名次排序問題 sorting

已知參賽選手的得分,你的任務是按照得分從高到底給出選手的排名。遺憾的是,儲存選手資訊的資料結構只支援一種操作,即將乙個選手從位置i移動到位置j,該移動不改變其他選手的相對位置,即如果i j,位置j和位置i 1之間的選手的位置都比原來加1,相反如果 i j,則位置i 1和位置j之間的選手的位置都比原來...