【題意】n個點的樹,m條鏈,求將一條邊的權值置為0使得最大鏈長最小。
【演算法】二分+樹上差分
【題解】
最大值最小化問題,先考慮二分最大鏈長。
對所有鏈長》mid的鏈整體+1(樹上差分)。
然後掃一遍,對[在所有不滿足鏈上]的邊取最大值並check。
具體做法:對於二分的最大鏈長,將所有鏈長》mid的鏈取最大值(鏈的數量記為num),然後用樹上差分整體+1。
樹上差分:a+1,b+1,lca(a,b)-2。dfs的時候判斷子節點的連邊(若子節點權=num則連邊參與比較),然後再把子節點權加進來。
最後看最大邊權是否》=最大鏈長和最長鏈的差值。
複雜度o(n log n)。
#include#includeview code#include
#include
using
namespace
std;
const
int maxn=300010
;int
read()while(isdigit(c=getchar()));
return s*t;
}int n,m,first[maxn],f[maxn][30],deep[maxn],dis[maxn],sum,num,mx,a[maxn],b[maxn],c[maxn],d[maxn],tot=0
,s[maxn];
struct edgee[maxn*2
];void insert(int u,int v,int w)
void dfs(int x,int
fa)}
int lca(int x,int
y)
return f[x][0];}
void dfs(int x,int
fa)}
bool check(int
l) mx=0;sum=0
; dfs(
1,0);
if(mx>=cha)return
1;else
return0;
}
intmain()
dfs(
1,0);
int l=0,r=0
,mid;
for(int i=1;i<=m;i++)
r++;
while(l
printf("%d
",l);
return0;
}
dfs的時候注意操作順序。
NOIp提高組 2015 運輸計畫
題目傳送門 題目大意 有一顆 n nn 個點的樹,每條邊有乙個權值 長度 有 m mm 條路線,每條路線的長度為路線上的所有邊的長度之和,你可以將任意一條邊的長度變成 0 00,改完之後,要使所有路徑中最長的路徑盡可能短,問最短可以是多少。比較顯然的,改的這條邊肯定在 m mm 條路線中最長的那條中...
NOIP2015提高組 運輸計畫
題目 bzoj4326 洛谷p2680 vijos p1983 uoj 150 codevs4632 codevs5440。題目大意 有一棵帶權樹,有一些運輸計畫,第i個運輸計畫從ai到bi,耗時為ai到bi的距離,所有運輸計畫一起開始。現在可以把一條邊權變成0,求最終運輸計畫最短要多少時間。解題思...
NOIP2015提高組Day2 運輸計畫
其實題目說那麼多,一句話就是 給定一棵帶權樹與m mm條路徑,你可以使一條樹上的邊的權值變為0,問你m mm條路徑的長度的最大值最小是多少。這道題讓我想到了貨車運輸這道題,但是更難,但方法可以借鑑。因為這是最大值最小問題,很顯然可以二分答案。那這個二分判斷怎麼打呢?我們如果遇到某條邊,所有超時的邊 ...