Query on a tree 樹鏈剖分

2022-05-01 14:00:09 字數 2231 閱讀 8966

題意:

給你一棵樹,和樹上邊的權值,在有q組詢問a,b,問你從節點a->節點1的路徑上,不小於b的最大的邊的權值是多少,輸出

離線維護最大值線段樹即可

模板題

#includeusing

namespace

std;

//input by bxd

#define rep(i,a,b) for(int i=(a);i<=(b);i++)

#define repp(i,a,b) for(int i=(a);i>=(b);--i)

#define ri(n) scanf("%d",&(n))

#define rii(n,m) scanf("%d%d",&n,&m)

#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)

#define rs(s) scanf("%s",s);

#define ll long long

#define see(x) (cerr<

#define lson l,m,pos<<1

#define rson m+1,r,pos<<1|1

#define inf 0x3f3f3f3f

#define clr(a,v) memset(a,v,sizeof a)typedef pair

pii;

/////////////////////////////////

/const

int n=1e5+10

;int t[n<<2

],n,m;

void up(int

pos)

void build(int l,int r,int

pos)

int m=(l+r)>>1

; build(lson);build(rson);up(pos);

}void upnode(int x,int v,int l,int r,int

pos)

int m=(l+r)>>1

;

if(x<=m)upnode(x,v,lson);

else

upnode(x,v,rson);

up(pos);

}int qmax(int l,int r,int l,int r,int

pos)

intid[n],head[n],pos,cnt,top[n],fa[n],son[n],siz[n],dep[n],a,b,c;

struct

edge

edge[n

<<1

];void add(int a,intb);

head[a]=pos;

}void dfs1(int x,intf)}

void dfs2(int x,int

topf)

}int qmax(int x,int

y)

if(dep[x]>dep[y])swap(x,y);

ans=max(ans,qmax(id[x]+1,id[y],1,n,1

));

return

ans;

}void

init()

struct

node

s[n];

bool

cmp(node a,node b)

struct

edge2

edge2[n];

bool

cmp2(edge2 a,edge2 b)

intans[n];

intmain()

dfs1(

1,1);dfs2(1,1);build(1,n,1

); ri(m);

rep(i,

1,m)rii(s[i].x,s[i].y),s[i].id=i;

sort(s+1,s+1+m,cmp);sort(edge2+1,edge2+1+n-1

,cmp2);

int l=1

; rep(i,

1,m)

ans[s[i].id]=qmax(1

,s[i].x);

}rep(i,

1,m)

printf(

"%d\n

",ans[i]==0||ans[i]==-inf?-1

:ans[i]);

}return0;

}

view code

Query on a tree 樹鏈剖分整理

樹鏈剖分整理 樹鏈剖分就是把樹拆成一系列鏈,然後用資料結構對鏈進行維護。通常的剖分方法是輕重鏈剖分,所謂輕重鏈就是對於節點 u的所有子結點v,size v 最大的v與u 的邊是重邊,其它邊是輕邊,其中 size v 是以v 為根的子樹的節點個數,全部由重邊組成的路徑是重路徑,根據 上的證明,任意一點...

樹鏈剖分 375 Query on a tree

樹鏈剖分並不是乙個複雜的演算法或者資料結構,只是能把一棵樹拆成鏈來處理而已,換一種說法,樹鏈剖分只是 資料結構 演算法在樹上的推廣,或者說,樹鏈剖分只是把樹hash到了幾段連續的區間上。主要參考kuangbin 以及 第二個其中的修改操作的解釋好像有問題,其例子中查詢11和10 的實際的遍歷和他的解...

樹鏈剖分 樹鏈剖分講解

好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...