我是超連結
我用的是二分+點分治的方法
二分m大的路徑長度,得到下界以後顯然是乙個nlog^2n的經典點分治,加上二分的log,顯然比較虛。但是點分治中有乙個log是sort需要的,我們就可以先一次點分治把sort的結果用vector存下來,這樣的話就能把總複雜度降為nlog^2,得到m大的路徑最後一次點分治暴力統計路徑。總複雜度是o(nlog^2n)的,但不知道是不是map和vector的問題,我常數賊大,然後就t了?!
下面是tle**,我覺得複雜度是對的,但是求正解的盆友不要看了。
但是這道題stl的用法很好,所以即使t了還是想著碼一下
#include
#include
#include
#include
#include
#include
#define inf 1e9
using
namespace
std;
const
int n=50005;
const
int nn=300005;
int n,tot,nxt[n*2],point[n],v[n*2],c[n*2],size[n],f[n],root,num,k,m,sum,len[n],dis[n],mid,id,game[nn],ans,vis[n],id;
vector
ini[nn]; map
answer;
void addline(int x,int y,int z)
void find(int x,int fa)
f[x]=max(f[x],sum-f[x]);
if (f[x]void dfs(int x,int fa)
}int calc(int x,int nowlen,int sc,int vv)
if (sc==2)//二分答案
if (sc==3)//輸出
}void work(int x,int sc)
}int check(int sc)
int main()
id++;check(1);id=0;
while (l<=r)
id++; id=0; check(3);
map::iterator it;i=0;
for(it=answer.begin();it!=answer.end();++it)
for (i=m;i>=1;i--) printf("%d\n",game[i]);
}
bzoj3784 樹上的路徑
time limit 10 sec memory limit 256 mb submit 789 solved 266 submit status discuss 給定乙個n個結點的樹,結點用正整數1.n編號。每條邊有乙個正整數權值。用d a,b 表示從結點a到結點b路邊上經過邊的權值。其中要求a ...
BZOJ3784 樹上的路徑
樹的點分治,在分治的時候將所有點到根的距離依次放入乙個陣列q中。對於一棵子樹裡的點,合法的路徑一定是q l q r 的某個數加上自己到重心的距離。定義五元組 v,l,m,r,w 表示當前路徑長度為v,在 l,r 裡選出最大值m,並加上w。用大根堆維護這些五元組,每次取出v最大的元素,並擴充套件出 l...
BZOJ3784樹上的路徑
題目描述 給定乙個n個結點的樹,結點用正整數1.n編號。每條邊有乙個正整數權值。用d a,b 表示從結點a到結點b路邊上經過邊的權值。其中要求a題解 把每次點分治時的dfs序寫下來,假設我們在乙個位置找能夠和它拼成一條鏈的另乙個位置,可以發現那些位置的順序在dfs序上構成了一段連續區間,用st表 堆...