BZOJ1758 WC2010 重建計畫

2022-05-31 17:33:11 字數 2230 閱讀 9235

description

input

第一行包含乙個正整數n,表示x國的城市個數. 第二行包含兩個正整數l和u,表示政策要求的第一期重建方案中修建道路數的上下限 接下來的n-1行描述重建小組的原有方案,每行三個正整數\(a_i,b_i,v_i\)分別表示道路\((a_i,b_i)\),其價值為\(v_i\) 其中城市由1..n進行標號

output

輸出最大平均估值,保留三位小數

sample input

42 3

1 2 1

1 3 2

1 4 3

sample output

2.500

hint

\(n\leqslant 100000,1\leqslant l\leqslant u\leqslant n-1,v_i\leqslant 1000000\)

考慮二分答案,然後把邊權減去二分出的答案,判斷是否存在》0的路徑即可

點分治合併路徑的時候記得按秩合併,即將子樹按最深深度排序後列舉,開乙個單調佇列,統計完一棵子樹後累計答案

二分有好幾個位置,最外面、點分時、枚舉子樹時,放最外面常數最大(然而我就是這麼寫的),放在中間的位置可以隨時改變二分上下界

為了卡常,可以先把點分治的重心列舉順序先弄出來,然後類似for迴圈去點分治(因為luogu單點時限,bzoj不需要)

/*program from wolfycz*/

#include#include#include#include#include#define inf 0x7f7f7f7f

using namespace std;

typedef long long ll;

typedef unsigned int ui;

typedef unsigned long long ull;

inline char gc()

inline int frd()

inline int read()

inline void print(int x)

const int n=1e5;

const double eps=1e-10,unit=1e-4;

int pre[(n<<1)+10],now[n+10],child[(n<<1)+10],val[(n<<1)+10];

int size[n+10],df[n+10],root[n+10];

bool vis[n+10],flag;

double dv[n+10],del;

int root,max,r_sz;

int n,l,r,tot;

void join(int x,int y,int z)

void insert(int x,int y,int z)

void get_root(int x,int fa,int sz)

res=max(res,sz-size[x]);

if (resr) return;

dv[dp]=max(dv[dp],v);

for (int p=now[x],son=child[p];p;p=pre[p],son=child[p])

}struct s1

bool operator

void merge(double *a,int &la,double *b,int &lb)

void divide(int len)

int f_sz=0;

sort(a+1,a+1+son_sz);

if (a[son_sz].deep<<1=l)

merge(f,f_sz,dv,a[i].deep);

} if (flag) return;

for (int i=1;i<=f_sz;i++) f[i]=-inf;

divide(len+1);

}bool check(double v)

void frt(int x)

is[x]=0;

}int main()

root=0,max=inf;

get_root(1,0,n);

frt(root);

while (l<=r)

printf("%.3lf\n",r);

return 0;

}

BZOJ 1758 Wc2010 重建計畫

要求平均值最大,二分平均值,判定是否存在一條合法路徑權值為正數,點分治 單調佇列 看上去沒有任何問題,然而其實每次點分的時候要按子樹深度從小到大排序然後更新答案 複雜度o n log 2 n 這個東西交上去又t了,然後學習了一下分數規劃怎麼二分,發現了一點神奇的方法,交上去又t了 可能我自己寫炸了 ...

BZOJ 1758 Wc2010 重建計畫

bzoj 1758 參考部落格 給出乙個 n 個節點帶邊權的樹,要求找出一條邊數在 l,u 之間的路徑使得 dfrace w 最大 n le100000,1 le l le u le n 1,v i le1000000 40sec,128mb 首先01分數規劃轉判斷問題,現在我們每個邊有新的邊權,我...

WC2010 重建計畫

嘟嘟嘟 要不這篇部落格我水一下?思路很顯然,點分治 01分數規劃 單調佇列。但就是難寫。點分治的時候我們把每乙個點到重心這條鏈按深度排序,然後對於每乙個點的鏈就有乙個連續深度的區間可以和這條鏈拼上,因為要找一條權值大於 0 的鏈,那就相當於找這個區間的最大值。然後隨著點深度遞增,這個區間就不斷向左移...