點分治序就是每次點分治時的dfs序拼起來。點分治序的長度應該是nlogn的。
然後對於每一條路徑(u,v),在出現了u的分治結構中,v總是在點分治序的一段區間裡,就可以同noi2010超級鋼琴一樣維護了,就是從堆中取出最大值,並把所在區間再分成兩部分扔進堆裡,重複m次即可。複雜度o(nlog^2n)。
**:
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn=50010;
const
int mlgn=900010;
int n,m,tim,a[mlgn],fz[maxn],ed[maxn],sz[maxn],st[mlgn][20],lg[mlgn];
bool vis[maxn];
struct edge
*con[maxn];
struct node
t[mlgn];
inline
bool
operator
<(const node &p,const node &q)
inline
int amx(int p,int q)
void getroot(int v,int fa,int size,int &root)
if(size>2*sz[v]) flag=0;
if(flag) root=v;
}void dfs(int v,int fa,int d)
void solve(int v,int size)
void init()
inline
int qry(int l,int r)
int main()
solve(1,n);
init();
for(int i=1;i<=tim;i++)
while(m--)
if(r.d1;
u.d=qry(u.l,u.r);
u.w=a[u.d]+a[u.p];
q.push(u);}}
return
0;}
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表 堆...