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 ...