練習 LCA練習2

2021-08-02 05:48:42 字數 1736 閱讀 1020

1.bzoj1787緊急集合

找一點使這一點到三個點有最短距離 列舉三個兩兩lca即可

#include#include#include#include#include#define inf 999999999

using namespace std;

int n,q,cnt;

int deep[500001],head[500001],fa[500001][20];

bool vis[500001];

struct datae[1000001];

void ins(int u,int v)

void insert(int u,int v)

void dfs(int x)

if(x==y)return x;

return fa[x][0];

}int val(int x,int y,int z)

}void dfs(int x)

} return fa[x][0];

}int main()

printf("%d",ans);

return 0;

}

3.codevs2370小機房的樹

同樣的基礎題 比上面的還簡單

#include#include#include#include#include#include#define m 100005

#define n 100005

using namespace std;

int n,m;int num=0;

int b[m],w[m],nt[m],p[n];

int fa[m][20],d[m],val[n];

void insert()

}void dfs(int x)

}int lca(int x,int y)

if(x==y) return x;

for(int i=h;i>=0;i--)

} return fa[x][0];

} int main()

return 0;

}

4.vijos1460拉力賽

記錄深度陣列和求lca即可

#include#include#include#include#include#include#define n 10005

#define ll long long

using namespace std;

int n,m;

int b[n],p[n],nt[n],fa[n][21],d[n];

ll w[n];

ll val[n];

ll cnt,ans;

void insert()

}void dfs(int x)

}void dfs(int x,int h)

} return fa[x][0];

}void clear()

int query(int x,int y)

int deal(int x,int y,int z)

int main()//如果最後多了乙個空行就pe了

clear();

insert();

dfs(0,0);

scanf("%d",&q);

for(int i=1;i<=q;i++)

} return 0;

}

2016夏季練習 LCA

這個是倍增法的寫法,回頭將tarjan演算法的方式寫上 include include include include include include using namespace std const int maxn 10000 10 int n,rt int l,r vectortree ma...

SICP練習 2 練習1 6

練習1.6 這道題通過由乙個新版本的 if來引出,主要討論的還是應用序和正則序的問題。我看到 將 if提供為一種特殊形式 時還滿頭霧水,並不太清楚什麼特殊形式。當再返回看 if的語法時才發現,這在第12頁 if的一般表示式下面一段。如果 得到真值,直譯器就去求值 並返回其值。注意,在此處已經返回其值...

程式設計練習(2)

鍊錶的回文結構 給定乙個鍊錶的頭指標a,請返回乙個 bool 值,代表其是否為回文結構。保證鍊錶長度小於等於 900。測試樣例 1 2 2 1 返回 true struct listnode class palindromelist right left next while right next ...