題目:
給出一棵小於n個節點的樹,和m個詢問,對於每個詢問,有兩個點,求點a到點b的最短距離,其中 n,m < 40000
在這裡講一下倍增lca演算法 雖然說暴力搜尋也可以過
f[i][j] 表示 從點i開始,向上2^j個點的位置,由於這道題帶權,再用v[i][j] 用相同的方法表示權值,再記錄深度d[i]。
於是就有了遞推式
f[i][j] = f[f[i][j-1]][j-1];
v[i][j] = v[i][j-1] + v[f[i][j-1]][j-1];
d[i] = d[fa[i][0]] + 1;
對於每次詢問,先用 lowbit 使 a ,b 深度相等,
再用二進位制列舉使 a,b 有公共祖先的最小向上深度每一位的值。
再說實現,一開始用 vector 記錄鄰接表 re,後來手寫鄰接表ac……
下面放**:
#include
#define lb(x) (x & (-x))
int n,q,i,j,k,f[50000][20],v[50000][20],d[50000],a,b,dep,ans,head[50000],last[50000],tot;
struct e e[100000];
void dfs(int u,int l)
} for (int i=head[u];i;i=e[i].next) if (e[i].t != l) dfs(e[i].t,u);
}int main()
for (dfs(1,0);q--;ans = 0)
for (dep = d[b] - d[a];dep;dep -= lb(dep))
for (i=17;i>=0;i--)
}if (a != b) printf("%d\n",ans);
}}
gfoj Problem 787 密室逃脫
problem 787 密室逃脫 time limit 2000 ms memory limit 524288 kb problem description 小j被關在密室裡!密室的構造是乙個h w的棋盤,即有h行w列,第i行第j列的房間用ai,j 表示。若ai,j 則該房間的門是鎖上的 若ai,j...
468 驗證IP位址
編寫乙個函式來驗證輸入的字串是否是有效的 ipv4 或 ipv6 位址。ipv4位址由十進位制數和點來表示,每個位址包含4個十進位制數,其範圍為 0 255,用 分割。比如,172.16.254.1 同時,ipv4 位址內的數不會以 0 開頭。比如,位址172.16.254.01是不合法的。ipv6...
468 驗證IP位址
編寫乙個函式來驗證輸入的字串是否是有效的 ipv4 或 ipv6 位址。ipv4 位址由十進位制數和點來表示,每個位址包含4個十進位制數,其範圍為 0 255,用 分割。比如,172.16.254.1 同時,ipv4 位址內的數不會以 0 開頭。比如,位址 172.16.254.01 是不合法的。i...