BZOJ3636 教義問答手冊

2022-05-15 13:52:49 字數 2174 閱讀 8174

傳送門乙個整數序列,給定若干詢問,每個詢問形如:在 \([l_i,r_i]\) 中選若干個長度為 \(l\) 的不相交的區間,使得其和最大。

比較容易寫出 \(\mathcal o(n^2)\) 的 \(dp\),定義 \(f_\) 表示區間 \([l,r]\) 的最大答案,那麼就有轉移方程

\[f_=\max\,f_+\sum_^ra_i\}

\]預處理 \(\mathcal o(n^2)\),詢問 \(\mathcal o(1)\),同時空間複雜度和預處理同階,詢問較快,但是無法接受。

考慮利用 \(l\le 50\) 這個條件,使用整體二分 —— 對於一段區間 \([l,r]\),在這個區間中的詢問 \(\lang ql,qr\rang\) 只有三種情況

對於前兩種,我們可以考慮遞迴進行解決,對於最後那種,其實就是講詢問劈成在 \([ql,mid]\) 以及 \([mid+1,qr]\) 兩個區間選擇的最大值,但是還有特殊情況——選了一段長度為 \(l\) 的區間跨越了 \(mid\),這個時候怎麼考慮?回到我們原來定義的狀態,\(f_\) 如果在左邊,那麼它的右端點就只有 \(l\) 個是有用的,即 \([mid-l+1,mid]\),同樣,如果 \(f_\) 在右邊,那麼它的左端點亦只有 \(l\) 個有用,即 \([mid+1,mid+l]\),如果我們只處理這幾個左、右端點,時間複雜度只有 \(\mathcal o(nl)\),同時我們可以將空間壓下去。定義 \(fl_\) 表示右邊界距離區間中點距離為 \(i\) , 左邊界下標為 \(j\) 的最大取值,同樣定義 \(fr_\) 表示左邊界距離區間中點距離為 \(i\) , 右邊界下標為 \(j\) 的最大取值,最後合併的時候再美劇一下選擇了一段跨越了 \(mid\) 的區間的情況。

總時間複雜度 \(\mathcal o(nl\log n+ql)\).

考慮在分治的過程中計算所有過中點的詢問的答案。假設當前的分治區間為 \([l,r]\),中點是 \(mid\)。然後我們先對於每乙個 \(l』\),預處理出 \([l』,mid]\) 這個區間中選若干個長度為 \(l\) 的區間,並在末尾選了 \(x\) 個數 \((x\le l)\) 的最大值,還有對於每乙個 \(r』\),處理出 \([mid+1,r』]\) 這個區間中選若干長度為 \(l\) 的區間,並在開頭選了 \(x\) 個數 \((x\le l)\) 的最大值,這個都可以用乙個 \(dp\) 求出。然後最後詢問合併一下即可。

using namespace elaina;

const int maxn=100000;

const int maxq=100000;

const int maxl=50;

int a[maxn+5],n,l,q;

struct query

query(const int l,const int r,const int i):l(l),r(r),id(i){}

};query q[maxq+5],tmp[maxq+5];

int ans[maxq+5];

void input()

}/** @brief 右邊界距離區間中點距離為 @p i , 左邊界下標為 @p j 的最大取值*/

int fl[maxl+5][maxn+5];

/** @brief 左邊界距離區間中點距離為 @p i , 右邊界下標為 @p j 的最大取值*/

int fr[maxl+5][maxn+5];

void solve_l(const int l,const int r)

}}void solve_r(const int l,const int r)

}}int counter;

void solve(const int l,const int r,const int ql,const int qr){

if(r-l+1qr)return;

register int mid=(l+r)>>1,cntl=ql-1,cntr=qr+1;

solve_l(l,mid);solve_r(mid+1,r);

for(register int t=ql;t<=qr;++t){

++counter;

if(q[t].r<=mid)tmp[++cntl]=q[t];

else if(mid多個區間詢問的時候,除了考慮莫隊、分塊意外,還可以想一下能否使用整體二分,而整體二分的時候,對於乙個區間,一般只考慮詢問跨越區間中點的情況,其他情況遞迴處理即可。

BZOJ3636 教義問答手冊

有三個不是那麼暴力的複雜度 o nlogn l ql qlogn 離線 然而只有離線的那個是滋磁的 4.4 等我細細道來 題意 有乙個長度為n的序列 元素有正有負 再來乙個l q組詢問,每次問區間 l,r 中,選出若干個不相交的長度正好是l的區間,使得和最大 總共有n l 1個區間嘛.再來乙個長度n...

BZOJ 3636 教義問答手冊

目錄傳送門 無論多麼麻煩的 寫完過後都要耐著性子檢查。首先有樸素 n 2 的 mathtt 感覺這個思路太神辣!對區間 1,n 進行分治。考慮在詢問 i 第一次覆蓋區間 text 時計算這個詢問。為什麼這是正確的?其實也就是為什麼 l,r 一定覆蓋這個詢問?容易想到如果 l,r 未覆蓋詢問 i 詢問...

BZOJ 3636 教義問答手冊 (分治)

乙個整數數列,多次詢問某段區間 li ri li ri 內,選出若干個長度為l l且不相交的連續段使選出來的數和最大。首先想樸素的區間dpd p設f i j f i j 表示區間 i,j i j 的答案。o n 2 o n2 轉移比較顯然。f i j ma x f i j 1 f i j l k j...