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 的鏈,那就相當於找這個區間的最大值。然後隨著點深度遞增,這個區間就不斷向左移...