WC2010 重建計畫

2022-05-09 10:42:19 字數 2168 閱讀 3075

嘟嘟嘟

要不這篇部落格我水一下?

思路很顯然,點分治+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 的,...