#include #include #include #include #define n 40005
#define m 80005
#define ll long long
using namespace std;
const int inf = 0x3f3f3f3f;
int ver[m],edge[m],head[n],next[m];
int n,m,tot,root;ll k;
void add(int x,int y,int w)
int sz[n],vis[n],mx,size;
ll d[n],q[n],l,r,ans=0;
//求出樹的重心 因為找到重心後,遞迴子樹不超過原來的一半,遞迴層數小於logn層
void getroot(int u,int fa)
///num代表的是子節點的最長鏈 size-sz[u]代表的是父親鏈長
num=max(num,size-sz[u]);
if (num}///計算某個節點所有子樹中的節點的到這個節點的距離
void getdis(int u,int fa)
}ll cal(int u,int val)
cout//開乙個左右指標,以左端點為基準移動,如果兩個距離是大於k,肯定移動右指標,
///也就是對於每乙個小的,去右邊尋找最遠能滿足條件的,而中間的一定滿足
while(lreturn sum;
}void dfs(int u)
}int main()
size = n;
mx = inf;
getroot(1, 0);
dfs(root);
printf("%lld\n", ans);
}return 0;
}
POJ 1741 點分治入門
tree 其實關於時間複雜度我也似懂非懂,大概就是把一顆樹分層,然後每一層的操作大概是 n log n 然後我們每次找樹的重心,就可以分logn層,所以總時間複雜度大概是就是n log n 關於路徑,我們先算出到根的距離,然後分成兩種,一種關於經過n節點,這是合法的,一種是不經過根節點,就是在一根子...
POJ 1741 點分治詳解
題意 給出乙個n 1e4 個點的樹,每條邊有權,求樹上長度小於等於k的路徑條數。u,v 和 v,u 算兩條。點分治 顧名思義,點分治就是對點進行分治,一般用於路經統計問題。對每個點而言,一條路徑要麼經過他,要麼不經過他,這就是分,即分成路徑經過此點和不經過此點。基本思想是 當經過某點的路徑可以比較方...
POJ1741 點分治模板
傳送門 求樹上兩點間路徑長度小於k的點對個數 參考資料 守望的澱粉質略解 粉紅兔大佬的澱粉質 演算法步驟 計算重心位置 計算答案 分治子問題繼續求解 1 3 include include include include include include include include include...