之江學院校賽 qwb與學姐 最大生成樹 LCA

2021-08-02 06:28:00 字數 1622 閱讀 1408

題目鏈結

思路:

有時候樹上的問題用lca比最短路那些演算法要高效的多.

題目中要求從a到比路徑的最大值,那麼這個值肯定在圖中所有短構成的乙個最大生成樹上(首先乙個連通圖可以滿足任意兩點互相到達,其次又滿足路徑盡可能的大

).所以對於這個題我們先要求最大生成樹.

其次,k比較大,如果用樸素的lca求的話每次o(n),實踐不允許,所以我們就需要用倍增法lca去求,預處理oo(nlogn),查詢依次logn.適用於查詢次數多的時候.

倍增法求lca

#include#define ri(a) scanf("%d", &a)

#define rl(a) scanf("%lld", &a)

#define rf(a) scanf("%lf", &a)

#define rs(a) scanf("%s", a)

#define pi(a) printf("%d\n", (a))

#define pf(a) printf("%lf\n", (a))

#define pl(a) printf("%lld\n", (a))

#define ps(a) printf("%s\n", (a))

#define w(a) while(a--)

#define clr(a, b) memset(a, (b), sizeof(a))

#define mod 100000007

#define inf 0x3f3f3f3f

#define exp 0.00000001

#define pii pair#define mp make_pair

#define pb push_back

using namespace std;

typedef long long ll;

const int maxn=1e5+10;

const int maxm=5e4+10;

struct node

q[2*maxn];

int pre[maxm],dis[maxm][100],depth[maxm],parent[100][maxm];//parent表示每次往上走2^k步的父親,dis表示每次走2^k路徑的最小值

int m,n,qq,kk;

vectorvt[maxm];

int ans=inf;

int cmp(node a,node b)

void init()

for(int k=0;kdepth[v])

swap(u,v);

for(int k=0;k<=kk;k++) }

if(u==v)

return ans;

for(int k=kk;k>=0;k--) }

ans=min(ans,dis[u][0]);

ans=min(ans,dis[v][0]);

return ans;

}int main()

return 0;}/*

4 5 3

1 2 6

1 3 8

2 3 4

2 4 5

3 4 7

2 31 4

3 4*/

2017浙工大之江學院校賽 C 組合數學 思維

time limit 1 sec memory limit 128 mb submit 105 solved 43 submit status web board zjc的acgirls隊的隊員最近比較忙,為了能夠取得更好的比賽成績,他們制定了乙個m天a掉n題的計畫,a掉一題可以是這m天的任何時候。...

之江學院 M qwb與二叉樹 卡特蘭數 dp

problem m qwb與二叉樹 time limit 1 sec memory limit 128 mb submit 121 solved 24 submit status web board description 某一天,qwb正在上資料結構課。老師在講台上面講著二叉樹,qwb在下面發著呆...

2019長沙學院新生賽題解

題目鏈結 a 打表找規律,發現每四個數就是0,所以找第乙個大於l的四的倍數,找第乙個小於r的四的倍數,然後異或。includeusing namespace std define ll long long int main ll tt 0 y 4 l 4 l,x r r 4 for ll i l i...