這居然是聯賽題我一臉懵逼。。根本沒往那方向上想。
題目大意:
讓你求樹上最短的路徑,但是路徑長度必須》=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大的路徑最後...