不得不說這題是真的難,看題解都差點沒用理解。)
給定平面上若干(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本來就應該...