題目: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...