思維 線段樹dp

2021-10-05 10:18:40 字數 2395 閱讀 5713

不得不說這題是真的難,看題解都差點沒用理解。)

給定平面上若干(1e5)點,每個點ab兩個權值,要求將其分為兩組,a組的a權值和加b組的b權值和最大,劃分條件轉化一下就是,不能有a出現在b的右下,也就是要找到一條不降的折線,其上是a,其下是b。我們認為位於折線上的那些點屬於b。

暴力dp是可做的,離散化xy並列舉每一列的劃分點。考慮優化,認為dp[i]表示,加入i點後,如果折線的最後乙個轉折點是i,那麼總和的最大值。它該怎麼更新呢,對於點1~i-1,如果它們比i低,那折線就可以從它們那裡拐過來,然後再加上b[i];同時,再加入i點後,其餘的dp值也需更新,比i高的折線會把i看作b,比i低的折線會把i看作a,分別加上這兩個值即可。

這裡我們注意到,已經用到了單點修改、區間加、詢問區間最大值的操作,就果斷線段樹,將y離散化後在y上建立線段樹,也就是dp陣列是用線段樹實現的。注意需要考慮x軸,這樣一條會把所有點視為a的折線,建線段樹的時候按1,1+tot範圍去建立即可。

**

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

4849

5051

5253

5455

5657

5859

6061

6263

6465

6667

6869

7071

7273

7475

7677

7879

8081

8283

8485

8687

8889

9091

9293

9495

9697

9899

100101

102103

104105

106107

108109

110111

112113

114115

116117

118119

120121

#includeusing namespace std;

#define ll long long

#define lson (o<<1)

#define rson (o<<1|1)

const int maxn=1e5+4;

struct point

}ps[maxn];

int _y[maxn];

ll val[maxn<<2],lazy[maxn<<2]; //val維護線段樹區間最大值,dp融入其中了

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

void pushup(int o)

void pushdown(int o)

}void update1(int o,int l,int r,int l,int r,ll add)

pushdown(o);

int mid=(l+r)/2;

if(l<=mid)

if(r>mid)

pushup(o);

}void update2(int o,int l,int r,int pos,ll x)

pushdown(o);

int mid=(l+r)/2;

if(pos<=mid)else

pushup(o);

}ll query(int o,int l,int r,int l,int r)

pushdown(o);

int mid=(l+r)/2;

ll res=0;

if(l<=mid)

if(r>mid)

return res;

}int n;

int main()

sort(_y+1,_y+n+1);

int tot=unique(_y+1,_y+1+n)-_y-1;

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

sort(ps+1,ps+1+n);

build(1,1,tot+1);

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

ll dpi=query(1,1,tot+1,1,ps[i].y)+ps[i].b;

update2(1,1,tot+1,ps[i].y,dpi);

update1(1,1,tot+1,1,ps[i].y-1,ps[i].a);

if(ps[i].y

線段樹優化dp

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

方塊 III 線段樹 思維

這題並不難,主要就是要想到,怎麼才可以做到將相同的數字給分開來,而方法就是將最開始出現的數字,和上乙個這個數字出現的位置之間,全部加上價值,而上乙個這樣的位置,減去價值。就這樣一直到n,最大的那個t 1 便是答案了,有點dp的感覺,但不是。include include include includ...

集訓 DP 搜尋 線段樹

集訓contest位址 vj private contest 128411 problem a poj 1018 剛開始非常缺乏思路,後來聽大家的討論再研究一下發現這道題可以暴力列舉a的。需要注意的是 f和 lf的問題。其實這個鍋不能給c g 編譯器,怪就怪當年的c標準委員會。double本來就應該...