JZOJ4715樹上路徑 點分治

2021-07-16 23:18:57 字數 1194 閱讀 4977

這居然是聯賽題我一臉懵逼。。根本沒往那方向上想。

題目大意:

讓你求樹上最短的路徑,但是路徑長度必須》=l,<=r,n<=10^5,r-l<=10^6,l,r<=10^9;

其實是我點分治沒怎麼打過,這其實是一道很一眼的點分治的題。。我是懵比了。。

可以算是模板題吧,我是直接點分治莽一波,然後就過了,題解還說是二分,我比賽時候就想到是二分。。mdzz。

**:

#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

int n,m,i,j,k,x,y,z,tot=0,num=0;

int next[200000],head[200000],go[200000],maxv[200000],size[200000];

ll ans,len[200000],h[200000],h1[200000],l,r;

inline

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

inline

void dfssize(int x,int y)

maxv[x]=max(maxv[x],n-size[x]);

}inline

void qsort(int l,int r,int mid)

inline

void dfs(int x,int y)

}j=num;

if (jcontinue;

for (i=k;iwhile (h[i]+h[j]>=l&&j>l) j--;

if (h[i]+h[j]if (h[i]+h[j]>=l) ans=min(ans,h[i]+h[j]);

if (j==l&&h[i]+h[j]>=l) break;

}if (k1);

}}int main()

dfssize(1,0);

ans=r+1;

for (i=1;i<=n;i++)

if (maxv[i]<=n/2)

if (ans==r+1) printf("%d\n",-1);

else

printf("%lld\n",ans);

}

JZOJ 4715 樹上路徑 (點分)

description 給出一棵樹,求出最小的k,使得,且在樹中存在路徑p,使得k s且k e。k為路徑p上的邊的權值和 input 第一行給出n,s,e。n代表樹的點數,s,e如題目描述。下面n 1行給出這棵樹的相鄰兩個節點的邊及其權值w。output 輸出共一行乙個整數,表示答案。若無解輸出 1...

JZOJ5055 樹上路徑

給定一棵 n 個節點的無根樹,每個點都有乙個非負整數的權值va li,定義一條路徑的價值為路徑上的點權和減去路徑的點權最大值。給定引數 p 請求出樹上有多少條價值是 p的倍數的路徑。注意 單點也算路徑。並且路徑 u v 和 v u 只算一次。1 n 105 1 p 107,0 va li 10 9 ...

BZOJ3784 樹上的路徑(點分治 STL)

我是超連結 我用的是二分 點分治的方法 二分m大的路徑長度,得到下界以後顯然是乙個nlog 2n的經典點分治,加上二分的log,顯然比較虛。但是點分治中有乙個log是sort需要的,我們就可以先一次點分治把sort的結果用vector存下來,這樣的話就能把總複雜度降為nlog 2,得到m大的路徑最後...