降臨(線段樹優化dp)

2022-05-06 16:03:12 字數 1028 閱讀 3685

選定點i會有代價\(c_i\),如果乙個區間j內的點全被選擇,就可以獲得回報\(p_j\)。點數和區間個數\(<1e5\)。

還以為是線段樹優化網路流(50萬個點200萬條邊看上去很可做的樣子畢竟lbn說過網路流20萬萬條邊完全沒問題),沒想到是個線段樹dp。

(雖然這兩個線段樹完全扯不上關係)

用\(f[i][j]\)表示考慮到第i個點,向左最近的尚未選定的點為j時的最大值。那麼,i+1可以選也可以不選。不選i時,\(f[i][j]\rightarrow f[i+1][i+1]\)。選i時,那麼i和左邊選過的連續點可以連成區間。則\(f[i][j]-c[i+1]+\sum_p_k\rightarrow f[i+1][j]\)。

#include #include #include #include using namespace std;

typedef long long ll;

typedef pairpi;

const int maxn=2e6+5;

ll n,m,x,y,z;

ll seg[maxn],add[maxn],c[maxn];

vectorvec[maxn];

void push(ll x)

}ll query(ll x,ll l,ll r,ll l,ll r)

void modify(ll x,ll l,ll r,ll l,ll r,ll v)

push(x); ll mid=(l+r)>>1;

if (l<=mid) modify(x<<1, l, mid, l, r, v);

if (r>mid) modify(x<<1|1, mid+1, r, l, r, v);

seg[x]=max(seg[x<<1], seg[x<<1|1]);

}int main()

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

printf("%lld\n", seg[1]);

return 0;

}

線段樹優化dp

等離子炮有n個操作訊號,第i個操作訊號的強度為b i 總體強度為各操作訊號的強度之和。由於有些訊號太弱了了 強度 0 水寶寶想把它們刪除。但是水寶寶自己不會刪除訊號,所以他找來了同船的隊友幫忙。有 m位隊友,第ii 位隊友只會刪除編號在 l i 和 r i 之間的訊號,且每刪除乙個訊號,花費 c i...

線段樹優化DP之Monotonicity

定義f i 為處理到第i位,所得匹配的最長長度,根據f i 我們可以求出它後面要跟的符號 可以用符號填滿,避免一些取模運算 對於i,我們列舉每乙個i前面的j,判斷是否合法,那麼 n 2 的做法就可以寫出來了 includeusing namespace std const int maxn 2000...

zoj 2900 DP(線段樹優化)

同樣是暴力,別人能過,我不能過,生活有的時候就是這麼無奈。dp i j k 表示前i個數取j個,最後一和是k的個數 然後改變dp順序可以將三維變為2維 注意下一下細節的地方。不然這樣暴力dp會超時 還有一種就是用線段樹來優化。優化到3770ms。不優化是6000 ms。有一點要注意的就是不能乙個都沒...