題解 BZOJ3636 教義問答手冊

2022-07-03 03:39:12 字數 2061 閱讀 2576

題目傳送門

作為泉嶺精神的締造者、信奉者、捍衛者、傳承者,pear決定印製一些教義問答手冊,以滿足泉嶺精神日益增多的信徒。pear收集了一些有關的詩選、語錄,其中部分內容摘錄在了【題目背景】裡。這些語錄是按出現的時間排好序的——pear很喜歡這樣的作風,於是決定在按時間排好序的基礎上,選擇部分語錄,製作成若干本教義問答手冊。

一共有n條語錄。pear決定從中選出某一段時間內的所有語錄,在此基礎上印製大小為l的若干本教義問答手冊。pear對印製的手冊有如下要求:

1. 每本手冊必須包含這個區間內連續的恰好l條語錄。

2. 不同手冊包含的語錄不能相同。

3. 每條語錄有乙個「主題相關程度」,這個數可正可負。pear希望所有手冊的語錄的「主題相關程度」之和盡可能大。

例如,對於區間[3,15]和l=3,一種選擇方法是:[4,6]+[9,11]+[12,14]。這三個區間長度都恰好為l,且互不重疊。

pear並沒有決定選哪段時間的語錄,因此他有q次詢問。每次詢問,給出兩個數[l,r]表示候選語錄的範圍是第l條到第r條。你能回答出每個詢問的最大「主題相關程度」之和麼?

\(n,q\le 10^5,l\le 50\)

這個題在有了提示(知道是分治)之後竟然自己做出來了,這裡寫一發記錄一下。

考慮單次詢問怎麼做,可以想到,我們可以設 \(f_i\) 表示前面 \(i\) 個數產生的最大貢獻,那麼我們可以得到轉移式:

\[f_i=\max(f_,f_+h_i-h_)

\]其中 \(h_\) 是字首和。答案就是 \(f_r\)。

考慮優化。因為這個題長度是固定的,所以我們就可以考慮整體操作。

假設我們現在在操作 \([l,r]\),那麼,我們現在能更新的答案就是左右端點在 \(mid\) 兩側的,其它的可以繼續遞迴下去。

可以想到的是,在中點兩側的詢問一定是要麼中間不選要麼就是中間選乙個(跨界的)區間。因為這個區間長度很小,所以我們就可以預處理出 \(f1_,f2_\) 分別表示從前往後(從後往前)起點在 \(st\),到 \(i\) 這一段產生的貢獻,然後列舉一下如果中間選了乙個區間的話左邊選了多少個以及不選的情況。

複雜度就是 \(\theta(n\log nl)\),但是因為跑不滿所以還是很快的。

#include using namespace std;

#define int register int

#define int long long

#define maxn 100005

template inline void read (t &t)while (c >= '0' && c <= '9') t *= f;}

template inline void read (t &t,args&... args)

template inline void write (t x)if (x > 9) write (x / 10);putchar (x % 10 + '0');}

int n,q,len,pre[maxn],ans[maxn];

struct node;

typedef vectorpoly;

#define sz(a) ((int)a.size())

#define maxl 55

int f1[maxl][maxn],f2[maxl][maxn];

void doit1 (int l,int r) }}

void doit2 (int l,int r) }}

void chkmx (int &a,int b)

void cdq (int l,int r,poly s)

else if (s[i].qr <= mid) s1.push_back (s[i]);

else s2.push_back (s[i]);

} cdq (l,mid,s1),cdq (mid + 1,r,s2);

}signed main());

} cdq (1,n,s);

for (int i = 1;i <= q;++ i) write (ans[i]),putchar ('\n');

return 0;

}

BZOJ3636 教義問答手冊

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

BZOJ3636 教義問答手冊

傳送門乙個整數序列,給定若干詢問,每個詢問形如 在 l i,r i 中選若干個長度為 l 的不相交的區間,使得其和最大。比較容易寫出 mathcal o n 2 的 dp 定義 f 表示區間 l,r 的最大答案,那麼就有轉移方程 f max f sum ra i 預處理 mathcal o n 2 ...

BZOJ 3636 教義問答手冊

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