點分治模板

2022-06-06 19:33:12 字數 874 閱讀 2260

[bzoj1316]

由於之前板子寫得太爛了,今天把它重新整理改進了一下

vis表示每個點是否已經當過根,所以注意dfs,findroot函式的計算過程中是不會對vis進行修改的

修改時只需要考慮對dfssolve中的有關位置進行修改即可,其它部分基本不變

#include using namespace std;

#define int long long

#define foradj(p) for(pairpr:g[p])

#define unpii(q,w) int q=pr.first, w=pr.second;

const int n = 10005;

vector > g[n];

int dis[n],siz[n],n,m,t1,t2,t3,k[n],ans[n],vis[n],sum,rt,rtval;

vectorst,wl;

sets;

void findroot(int p,int ff)

}mx=max(mx,sum-siz[p]);

if(mx>n>>m;

for(int i=1;i>t1>>t2>>t3;

g[t1].push_back();

g[t2].push_back();

}for(int i=1;i<=m;i++)

sum=n;

rtval=1e18;

findroot(1,0);

solve(rt);

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

}

點分治模板

luogu 3806 近些日子學了點分治,當然只是學了個模板。所謂點分治,使用於處理樹上路徑的一種分治手段。因為利用了重心的性質,時間複雜度可以保證呢。所謂演算法流程 選取當前子樹的重心 計算路徑總數,不管路徑是否過當前重心 後面會去重 計算起點和終點在同一顆子樹中的合法路徑 因為這條路徑不是簡單路...

點分治模板

這兩天跟著學了一手樹上點分治模板,然後有一些感悟,決定來寫一發部落格.首先,鑑於鄙人的經驗,如果想要較快速地學習乙個新演算法,肯定還是先看一道經典的例題比較好,所以我們先來一道例題.給你一棵tree,以及這棵樹上邊的距離.問有多少對點它們兩者間的距離小於等於k 輸入格式 n n 40000 接下來n...

模板 點分治

poj 1741 include include using namespace std const int n 10010 const int inf 0x3f3f3f3f int n,k,ans int head n nxt 2 n to 2 n w 2 n tot 鏈式前向星 void add...