解題思路:一開始我想用樹鏈剖分,但是感覺最壞的情況也有o(n^2)(如果出題者有意要卡你,也肯定過不了),其實用樹上倍增最高複雜度也是o(n^2),如果這棵樹是一條鏈。反正都有被卡的可能性,乾脆就打一下樹上倍增的模板吧。
#include#include#include#include#define n 100009
using namespace std;
vectors[n];
int fa[n][21],h[n],w[n];
void dfs(int u,int p)
return fa[u][0];
} int main()
printf("\n");
} return 0;
}
樹上倍增(模板)
題意 給出結點數為n的一棵樹,每個結點有權值 m 次詢問,對於每次詢問 a,b,l,r,求出結點a到結點b路徑經過的點中,權值在在區間 l,r 內的權值和。sample input 5 31 2 1 3 2 1 22 4 3 12 5 4 5 1 3 1 1 1 1 3 5 2 3 sample o...
HDU2586 LCA樹上倍增模板)
題意 給你一棵樹樹上任意兩節點有且僅有一條路徑可以到達,問求任意兩節點間的距離 題解 lca樹上倍增 o include include include include include include includeusing namespace std define clr a,b memset ...
模板 最近公共祖先 樹上倍增
完整部分點這裡 有 n 種辦法可以解決lca問題,這裡我們只講一種,用樹上倍增的方法來實現 lca。在沒有學習倍增寫lca之前,你是怎麼樣求lca的呢?至少,我是老老實實地讓這兩個點一步一步往上移並找出它們的路徑第一次交匯的地方。這種方法固然可行 好想,但它的效率實在不高。但是,我們完全可以通過提高...