想到點分治倒是不難,但是怎麼總是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...