很多人寫了題解了,我就懶得寫了,推薦一篇部落格
那就分享一下我的理解吧(說得好像有人看一樣
對於每個點都只有選與不選兩種情況,所以直接用倍增預處理出來兩種情況的子樹之內,子樹之外的最值,最終答案以拼湊的方式得出
如果這個題要修改權值的話就真的只能用動態dp了(好像還有那個什麼全域性平衡樹
我真的覺得去年出題人只是想出乙個倍增,結果被動態dp幹了(ark:出題人真的只是想出乙個動態dp
#include#include#include
using
namespace
std;
const
int maxn=100005
;const
long
long inf=1ll<<60
;long
long f[maxn][30],g[maxn][30],f[maxn][30][2][2];char ch[10
];int n,m,ecnt,v[maxn<<1],nx[maxn<<1],dep[maxn],info[maxn],fa[maxn][30
];void add(int u1,int v1)
void dfs1(int x,int
fath)
void dfs2(int
x)long
long solve(int x,int a,int y,int
b),ty[2]=,nwx[2],nwy[2
]; tx[a]=f[x][a];ty[b]=f[y][b];
for(int i=25;i>=0;i--)if((dep[x]-dep[y])&(1
<
if(x==y)return nwx[b]+g[y][b];
for(int i=25;i>=0;i--)if(fa[x][i]!=fa[y][i])
int lca=fa[x][0]=fa[y][0
];
long
long ret1=g[lca][0]+f[lca][0]-f[x][1]-f[y][1]+tx[1]+ty[1
], ret2=g[lca][1]+f[lca][1]-min(f[x][0],f[x][1])-min(f[y][0],f[y][1])+min(tx[0],tx[1])+min(ty[0],ty[1
]);
return
min(ret1,ret2);
}int
main()
}
P5024 保衛王國 倍增 dp
窩當然不會ddp啦,要寫這題當然是考慮優化裸dp啦,但是這題非常麻煩,於是變成了黑題。首先,這個是沒有上司的舞會模型,求圖的帶權最大獨立集。不考慮國王的限制條件,有 dp x 0 dp y 1 dp x 1 min dp y 1 dp y 0 現在考慮限制條件,如果對每乙個限制條件都做一次dp,複雜...
倍增 rmq 忠誠 洛谷P1816
老管家是乙個聰明能幹的人。他為財主工作了整整10年,財主為了讓自已賬目更加清楚。要求管家每天記k次賬,由於管家聰明能幹,因而管家總是讓財主十分滿意。但是由於一些人的挑撥,財主還是對管家產生了懷疑。於是他決定用一種特別的方法來判斷管家的忠誠,他把每次的賬目按1,2,3 編號,然後不定時的問管家問題,問...
倍增 Floyd 跑路 洛谷P1613
小a的工作不僅繁瑣,更有苛刻的規定,要求小a每天早上在6 00之前到達公司,否則這個月工資清零。可是小a偏偏又有賴床的壞毛病。於是為了保住自己的工資,小a買了乙個十分牛b的空間跑路器,每秒鐘可以跑2 k千公尺 k是任意自然數 當然,這個機器是用longint存的,所以總跑路長度不能超過maxlong...