SPOJ375 樹鏈剖分

2021-09-08 16:53:05 字數 1407 閱讀 3407

題目:query on a tree

題意:給定一棵樹,告訴了每條邊的權值,然後給出兩種操作:

(1)把第i條邊的權值改為val

(2)詢問a,b路徑上權值最大的邊

分析:本題與hdu3966差不多,區別就是:hdu3966是告訴樹中點權的值,這裡是邊權。

所以我們可以轉化,用邊的孩子節點來表示該邊。

#include #include #include #include using namespace std;

const int n=50010;

const int inf=1<<30;

int n,tim;

int num[n],siz[n],top[n],son[n];

int dep[n],tid[n],rank[n],fa[n];

int head[n],to[2*n],next[2*n],w[2*n],edge;

struct edge

;edge tmp[2*n];

void init()

void addedge(int u,int v,int c)

//樹鏈剖分部分

void dfs1(int u,int father,int d)

}}void dfs2(int u,int tp)

}//線段樹部分

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

int max[4*n];

void pushup(int rt)

void build(int l,int r,int rt)

int mid=(l+r)>>1;

build(lson);

build(rson);

pushup(rt);

}void update(int l,int r,int rt,int p,int val)

int mid=(l+r)>>1;

if(p<=mid)

update(lson,p,val);

else

update(rson,p,val);

pushup(rt);

}int query(int l,int r,int rt,int l,int r)

void change(int x,int val)

int query(int x,int y)

int main()

build(2,n,1);

while(1)

}return 0;

}

SPOJ375 樹鏈剖分

題目 query on a tree 題意 給定一棵樹,告訴了每條邊的權值,然後給出兩種操作 1 把第i條邊的權值改為val 2 詢問a,b路徑上權值最大的邊 分析 本題與hdu3966差不多,區別就是 hdu3966是告訴樹中點權的值,這裡是邊權。所以我們可以轉化,用邊的孩子節點來表示該邊。inc...

spoj375 樹鏈剖分

第一次寫樹鏈剖分的題目,下面說下我對樹鏈剖分的理解 以spoj為例,題意是給你一棵樹,有兩種操作,一種是修改某條邊的權值,一種是詢問節點a到節點b之間的路徑上所有邊的最大路徑。處理以上所有的資訊只需要兩個dfs就可以 第乙個dfs,dfs1處理father,size,depth,son 如下 voi...

SPOJ 375 樹鏈剖分

點選開啟鏈結 題意 給個樹和樹上的權值,兩個操作,q u v,問u到v的邊上的最大權值,c u v,將第u條邊的權值改為v 思路 今天學了學樹鏈剖分,這題是個檢驗模版的題目,理論我是解釋不清楚的,自己在九野聚聚那學來的乙份模版 include include include include incl...