幾乎同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 首先我們有乙個暴力...