GFOJ problem468 出去玩 解題報告

2021-07-29 07:46:03 字數 955 閱讀 4408

題目:

給出一棵小於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...