BZOJ3784 樹上的路徑 點分治序 ST表

2021-08-13 08:53:22 字數 1159 閱讀 6931

點分治序就是每次點分治時的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表 堆...