Tree POJ 1741 點分治 尺取

2021-09-26 13:46:09 字數 1484 閱讀 6237

想到點分治倒是不難,但是怎麼總是tle呢?這個就很煩了,然後就想到了一種把solve()函式裡的那個

尺取的主要方式:

while(l < r)

else r--;

}

#include #include #include #include #include #include #include #include #include #include #include #include #define lowbit(x) ( x&(-x) )

#define pi 3.141592653589793

#define e 2.718281828459045

#define inf 0x3f3f3f3f

#define efs 1e-6

#define half (l + r)>>1

#define lsn rt<<1

#define rsn rt<<1|1

#define lson lsn, l, mid

#define rson rsn, mid+1, r

#define ql lson, ql, qr

#define qr rson, ql, qr

#define myself rt, l, r

using namespace std;

typedef double lb;

typedef unsigned long long ull;

typedef long long ll;

const int maxn = 1e4 + 7;

int n, m, k, rt, mx, cnt, head[maxn], siz[maxn], son[maxn], all, ans;

bool vis[maxn];

struct eddge

}edge[maxn<<1];

inline void addeddge(int u, int v, int w)

inline void add(int u, int v, int w)

void findrt(int u, int fa)

son[u] = max(son[u], all - siz[u]);

if(son[u] < mx)

}int stop, stap[maxn];

void query(int u, int fa, int dis)

}inline int solve(int root, int dis)

else r--;

}return sum;

}void divide(int u)

}inline void init()

int main()

findrt(1, 0);

divide(rt);

printf("%d\n", ans);

}return 0;

}

Tree POJ 1741 (樹分治入門)

參考 這題的兩個關鍵部分 1.求出樹的重心 這在之前的部落格裡面提到,不在敘述 2.如何進行分治。首先,如果我們選定乙個點作為根節點,那麼一條路徑要麼經過這個根節點,要麼不經過這個根節點。題目要求出所有路徑小於等於k的路徑,我們可以這樣考慮 先不考慮重複的 依次把每個點都當做根節點,那麼我們只要df...

POJ 1741 點分治詳解

題意 給出乙個n 1e4 個點的樹,每條邊有權,求樹上長度小於等於k的路徑條數。u,v 和 v,u 算兩條。點分治 顧名思義,點分治就是對點進行分治,一般用於路經統計問題。對每個點而言,一條路徑要麼經過他,要麼不經過他,這就是分,即分成路徑經過此點和不經過此點。基本思想是 當經過某點的路徑可以比較方...

POJ1741 點分治模板

傳送門 求樹上兩點間路徑長度小於k的點對個數 參考資料 守望的澱粉質略解 粉紅兔大佬的澱粉質 演算法步驟 計算重心位置 計算答案 分治子問題繼續求解 1 3 include include include include include include include include include...