我們先換種方式說一下\(k*f_\):
對於葉子點對\((x,y)\),設其\(lca\)為\(z\)。
我們對\(z\)也進行賦值,\(na為\(0\),反之則為\(1\)。
那麼\(k*f_\)其實就是如果\(x/y\)和\(z\)的值相同,那麼就會產生\(f_\)的代價。
於是我們現在變成了點的代價,我們考慮樹形dp:
設\(f_\)表示\(x\)的子樹,選了\(i\)個\(b\)的最小代價,\(val_\)表示\(x\)對深度為\(i\)的代價,即\(\sum\limits_f_\)。
我們在dfs過程中列舉下從根到\(x\)的路徑上各個路由器是\(0\)還是\(1\),記為\(vis_i\)。
到葉子時直接推出即可,之後可以樹形揹包合併,注意只能更新合法(滿足\(vis_x\))的狀態。
本質就是列舉每個路由器的狀態,只不過一次列舉一條鏈,保證複雜度。
code:
#includeusing namespace std;
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
typedef long long ll;
const int maxn=15;
const int maxm=3010;
const ll inf=1e18;
int n;
int a[maxm];
ll ans;
ll cost[maxm][2],val[maxm][maxn],f[maxm][maxm];
bool vis[maxm];
inline ll read()
while(c>='0'&&c<='9')res=res*10+c-'0',c=getchar();
return res*f;
}inline int lca(int x,int y)
void dfs(int x,int dep,int l,int r)
int main()
dfs(1,1,1,1
for(int i=0;i<=(1
return 0;
}
bzoj 1495 NOI2006 網路收費
坑了一上午qaq感覺自己好弱智啊 bzoj上的題面坑死人,2n是鬧哪樣啊,明明是2 n,害的我還以為是水題,wa了好幾次。然後上cogs 好評 上看了下題,發現是2 n,然後 裡的省空間方法好麻煩,於是直接用vector 動態開節點水過去了。話說我這個寫得怎麼這麼像線段樹2333333 includ...
並不對勁的 noi2006 網路收費
題目略長,就從大視野上覆制了。聽上去好像費用流,然而 表示略長的題目的分界線 網路已經成為當今世界不可或缺的一部分。每天都有數以億計的人使用網路進行學習 科研 娛樂等活動。然而,不可忽視的一點就是網路本身有著龐大的執行費用。所以,向使用網路的人進行適當的收費是必須的,也是合理的 my市ns中學就有著...
NOI2019網路同步賽遊記
我發的郵件 f沒收到,後來去專門詢問才整到乙個名額 估計是嫌我太菜,參加了也是墊底 上午寫了到類似隨機遊走的高斯消元期望dp,然後頹頹頹 下午打洛咕月賽。t1一直50pts,後來才知道是鍋 t2先手賤寫了個假演算法,然後手寫了個splay艹過去 t3是原題,懶著寫正解了,60pts暴力多短 畢竟人是...