線段樹優化dp

2022-06-08 16:06:12 字數 1771 閱讀 7306

。等離子炮有n個操作訊號,第i個操作訊號的強度為b[i]。總體強度為各操作訊號的強度之和。

由於有些訊號太弱了了 (強度<0),水寶寶想把它們刪除。但是水寶寶自己不會刪除訊號,所以他找來了同船的隊友幫忙。

有 m位隊友,第ii 位隊友只會刪除編號在 l[i] 和 r[i]之間的訊號,且每刪除乙個訊號,花費 c[i]格能量。飛船一共有 k格能量,問他在請隊友刪除完訊號後,總體強度最大是多少。

注:本系列題不按難度排序哦

輸入格式:

第一行包含三個正整數 n,k,m

第二行包含 n個正整數 b1,b2,⋯,bn,表示各訊號的強度。

接下來 m 行,每行三個正整數li,ri,ci,表示乙個隊友的屬性。

輸出格式:

輸出一行乙個整數,表示最大的訊號強度

示例1

複製

5 10 5

10 -2 -5 7 -10

1 1 5

2 4 10

4 4 12

3 4 10

1 5 15

複製

5

樣例解釋:花費10的代價除掉a[3],答案即為10+7-10-2=5

對於 100% 的資料,1≤n,m≤10^5;1≤k≤500;1≤c[i]≤500;1≤l[i]≤r[i]≤n;-10^9≤b[i]≤10^9

這個題目就是先找a[i]小於0的點就是i值

然後再用線段樹尋找在這個區間內的價值最小的那個區間然後再跑乙個01揹包

注意一下這個區間的跟新和查詢

#include#include

using

namespace

std;

const

int maxn=5e5+100

;const

int inf=0x3f3f3f3f

;typedef

long

long

ll;struct

nodet[maxn*4

];int

a[maxn],b[maxn],c[maxn];

intdp[maxn];

void build(int p,int l,int

r)}

void update(int p,int l,int r,int

x)

int mid=(t[p].l+t[p].r)/2

;

if(l<=mid)

if(r>mid)

}int query(int p,int

x)

int mid=(t[p].l+t[p].r)/2

;

if(x<=mid)

else

} int

main()

build(

1,1,n);

intl,r,x;

for(int i=1;i<=m;i++)

ll ans=0

;

int cnt=0

;

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

}for(int i=1;i<=cnt;i++)

}printf(

"%lld\n

", ans+dp[k]);

}

降臨(線段樹優化dp)

選定點i會有代價 c i 如果乙個區間j內的點全被選擇,就可以獲得回報 p j 點數和區間個數 1e5 還以為是線段樹優化網路流 50萬個點200萬條邊看上去很可做的樣子畢竟lbn說過網路流20萬萬條邊完全沒問題 沒想到是個線段樹dp。雖然這兩個線段樹完全扯不上關係 用 f i j 表示考慮到第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。有一點要注意的就是不能乙個都沒...