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

2021-08-16 14:13:45 字數 1272 閱讀 9836

我是超連結

我用的是二分+點分治的方法

二分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表 堆...