2018 6 23集訓 y 帶權二分

2022-08-21 05:39:08 字數 1979 閱讀 3441

幾乎同hnoi2018道路,但將題面中的"小 w 決定對每個城市翻修恰好一條通向它的道路,即從公路和鐵路中選擇一條並進行翻修"這句話刪去,即改為可以任意選擇$n-1$條邊翻修。

資料範圍不變。

考慮樸素dp。

即,在可以通過原題的**的基礎上,加上一維表示已選擇的邊的數量,同時轉移上多出兩邊都選和都不選的方案。

複雜度$o(n2d2)$($d$為深度,$d \leq 40$),30分。

考慮優化,然而從dp的角度較難下手。

注意到有一維跟數量有關,同時打表發現,若令答案關於選擇邊的數量的函式,這個函式單增,且斜率(即差分後)也是單增的。

於是考慮帶權二分(出題人那邊叫凸優化?)。

刪除最後一維,二分斜率$k$,每次轉移時若新加入一條邊,則強制加上$k$的貢獻。

這樣,可以通過控制$k$的大小來控制得到的最優解中選擇的邊的數量,$k$大則選的邊減少,$k$小則選的邊增多。

二分到最優解選擇的邊數恰好為$n-1$時即可停止。

複雜度$o(nd^2\log k)$,其中$k$為斜率的值域。

——然而以上部分博主考試都想到了

但是,有時會出現二分不到$n-1$的情況。

具體來說,比如需要$3$條邊,而最後二分的結果卻一直在$2$和$4$之間來回變化。

有兩種解決方案,一種是開long double,並在最後強制認為選到了$3$,即,對$4$或$2$得到的結果$f$,令$ans=f-3k$(本來應是$ans=f-4k$)。

——然後就會像博主一樣被卡常$0.1$秒變成60分,需要調斜率值域才能過。

第二種,在dp統計方案時,若某個轉移的價值和目前為止的最優值相同,但選取次數較最優值更少,那麼更新選取次數為新的更小的選取次數。

然後在統計答案時若出現這種情況,那認定$2$是正確的,選擇$ans=f_2-3*k$即可。

這樣就可以開long long了!

然後程式就快了整整3倍,無壓力通過......

第二種方法來自xzk dalao。

(即現場rk1 205 pts的dalao,rk2 才160,蒟蒻博主rk4 才80 pts,現場有接近80個35-45分的人......)

事實證明,對帶權二分的理解還不到位......

**:

#include#includeusing namespace std;

#define print(...) fprintf(stderr,__va_args__)

typedef long long ll;

const int n=20009;

const int d=49;

inline int read()

int n,top;

int ch[n][2];

ll a[n],b[n],c[n],inc;

ll f[d*2][d][d],h[d*2][d][d],g[d][d],cg[d][d];

bool v[d*2][d][d],tv[d][d];

inline void dfs(int u,int dep)

return;

} dfs(ch[u][0],dep+1);

dfs(ch[u][1],dep+1);

for(int i=0;i<=dep;i++)

for(int j=0;j+i<=dep;j++)

if(v[top-1][i+1][j] && v[top][i][j])

if(v[top-1][i][j] && v[top][i][j])

if(v[top-1][i+1][j] && v[top][i][j+1])

}top--;

memset(v[top],0,sizeof(v[top]));

for(int i=0;i<=dep;i++)

for(int j=0;j+i<=dep;j++) }

int main() }

printf("%lld\n",ans);

return 0;

}

DP凸優化 帶權二分

對於如要求選m mm個東西的最優化問題,f i f i f i 表示選了i ii個東西的答案,則dp的時間和空間複雜度必然都與m mm線性相關。但如果f i f i f i 關於i ii是乙個斜率單調不增的函式 凸函式 則可以使用dp凸優化將複雜度降為與log m log m logm 線性相關。考...

帶權二分 記錄一些帶權二分的一些題目

rt 帶權二分主要是處理問題如在物品中選擇k個,或者分k組,這些問題都有乙個共性就是選得越多越好 滿足單調性質 對於平常的處理方法我們都是利用dp處理,將選擇多少個作為一維度,但是在有些情況下,時空複雜度是容不下的。由於其具有單調性,那麼我們可以利用決策單調性 或者斜率優化 或者用同樣利用到單調性的...

非常簡單地理解帶權二分(wqs二分)

非常感性簡單地理解帶權二分 又名 wqs 二分 儘管不是很嚴謹,如有錯誤請指出 large natural gosha is hunting 原題鏈結 更好閱讀體驗 設我們有 a 個紅球和 b 個藍球,用紅球抓 i 號胖可丁的概率是 a i 用藍球抓 i 號胖可丁的概率是 b i 首先我們有乙個暴力...