洛谷 P5024 保衛王國 (倍增)

2022-03-17 03:44:28 字數 1252 閱讀 8349

很多人寫了題解了,我就懶得寫了,推薦一篇部落格

那就分享一下我的理解吧(說得好像有人看一樣

對於每個點都只有選與不選兩種情況,所以直接用倍增預處理出來兩種情況的子樹之內,子樹之外的最值,最終答案以拼湊的方式得出

如果這個題要修改權值的話就真的只能用動態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...