NOIP 提高組2015 運輸計畫

2022-04-30 03:24:10 字數 1270 閱讀 9761

【題意】n個點的樹,m條鏈,求將一條邊的權值置為0使得最大鏈長最小。

【演算法】二分+樹上差分

【題解】

最大值最小化問題,先考慮二分最大鏈長。

對所有鏈長》mid的鏈整體+1(樹上差分)。

然後掃一遍,對[在所有不滿足鏈上]的邊取最大值並check。

具體做法:對於二分的最大鏈長,將所有鏈長》mid的鏈取最大值(鏈的數量記為num),然後用樹上差分整體+1。

樹上差分:a+1,b+1,lca(a,b)-2。dfs的時候判斷子節點的連邊(若子節點權=num則連邊參與比較),然後再把子節點權加進來。

最後看最大邊權是否》=最大鏈長和最長鏈的差值。

複雜度o(n log n)。

#include#include

#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;

}

view code

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條路徑的長度的最大值最小是多少。這道題讓我想到了貨車運輸這道題,但是更難,但方法可以借鑑。因為這是最大值最小問題,很顯然可以二分答案。那這個二分判斷怎麼打呢?我們如果遇到某條邊,所有超時的邊 ...