嘟嘟嘟
要不這篇部落格我水一下?
思路很顯然,點分治+01分數規劃+單調佇列。
但就是難寫。
點分治的時候我們把每乙個點到重心這條鏈按深度排序,然後對於每乙個點的鏈就有乙個連續深度的區間可以和這條鏈拼上,因為要找一條權值大於\(0\)的鏈,那就相當於找這個區間的最大值。然後隨著點深度遞增,這個區間就不斷向左移,就成了滑動視窗了。
細節就看shadowice1984的題解啦!
我寫的時候沒有把點分樹建出來,只記錄了重心序列,因為重心是按dfs序找的,所以只要每次用完後標記,就不會出問題,還省去了遞迴。
#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define enter puts("")
#define space putchar(' ')
#define mem(a, x) memset(a, x, sizeof(a))
#define in inline
typedef long long ll;
typedef double db;
const int inf = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 1e6 + 5;
inline ll read()
inline void write(ll x)
int n, ll, rr;
struct edge
e[maxn << 1];
int head[maxn], ecnt = -1;
in void addedge(int x, int y, ll w)
; head[x] = ecnt;
}int pos[maxn], pcnt = 0;
bool out[maxn];
int cg, siz, siz[maxn], max[maxn];
in void dfs0(int now, int _f, int& cg)
max[now] = max(max[now], siz - siz[now]);
if(!cg || max[cg] > max[now]) cg = now;
}in void dfs(int now)
struct node
}t[maxn], q[maxn];
in void dfs_dep(int now, int _f, int dep, int& max)
db b[maxn], dis[maxn], mid, ans;
in void dfs_dis(int now, int _f, int dep, db d)
int l, r, hd, tl, tcnt = 0;
in void solve(); }
sort(t + 1, t + tcnt + 1);
for(int i = 1; i <= t[tcnt].val; ++i) b[i] = -inf;
for(int i = 1; i <= tcnt; ++i)
; }
for(int j = min(rr, t[i].val); j >= max(1, ll - t[i - 1].val); --j)
; }
if(hd <= tl) ans = max(ans, q[hd].w + dis[j]);
if(ans > 0) return;
} }
for(int j = 1; j <= t[i].val; ++j) b[j] = max(b[j], dis[j]);
} out[pos[id]] = 1;
}}int main()
siz = n; dfs(1);
db l = 0, r = 1e6;
for(int t = 1; t <= 35; ++t)
printf("%.3lf\n", l);
return 0;}/*
82 4
1 2 3
1 4 4
3 2 4
3 5 6
6 2 9
6 8 2
2 7 4
*/
WC2010 重建計畫 題解
給定一棵樹,邊有邊權,要求找到一條長度在 l,r 之間的鏈,使得鏈的總價值和除以鏈長最大 顯然,這個式子的形式讓人想到了01分數規劃。於是根據01分數規劃的套路,先二分乙個答案 考慮如何判斷,現在等於把所有邊都減去了乙個 mid 要看有沒有一條價值大於0的長度介於 l,r 的鏈 是不是感覺點分治呼之...
WC2010 重建計畫 長鏈剖分
lg傳送門 又一道長鏈剖分好題。這題寫點分治的人應該比較多吧,但是我太菜了,只會長鏈剖分。如果你還不會長鏈剖分的基本操作,可以看看我的長鏈剖分總結。首先一看求平均值最大,馬上想到套個二分,每次把邊權變為原來的邊權減去二分的答案,看樹上有沒有長度在 l 和 u 之間的正權鏈就好了。於是乎問題就轉變成了...
WC2010 重建計畫 長鏈剖分 點分治
題目描述 有一棵大小為 n 的樹,給定 l,r 要求找到一條長度在 l,r 的路徑,並且路徑上邊權的平均值最大 1 leq n,l,r leq 10 5 前幾天沉迷初賽來寫幾道資料結構恢復一下 能力,坑填完之後可能就要開始啃思維題了qwq。這個題貌似長鏈剖分和點分複雜度都是 o nlog 2n 的,...