題目鏈結
思路:
有時候樹上的問題用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...