原题链接:
https://vjudge.net/problem/POJ-2763
题意:
维护一个树,权值在边上,支持单点更新和区间查询操作。
题解:
树链剖分的模板题,只不过把点权换成了边权,因为树每个点头上只有一条边,所以可以把边权映射到它的深度较深的那个点上,然后就套上模板就好了。
总结:
虽然是个模板提,但是还是wa到怀疑人生。
首先我开始是用mp[mk(u,v)]哈希的边,但是tle了。
后来用边的序号来就快了很多。
然后就是刚开始的时候以为应该在每次查询的时候最后如果x==y的话都减去深度最小的那个点,保证查询的是边权,但是无限wa。怀疑了两天人生之后发现查询每次跳top的时候并不是跳到了top,而是跳到了top的父亲,所以如果x==y的话再减去深度最小的点的话就多余了。。
代码:
#define push_back pb
#define make_pair mk
#define rd read()
#define mem(a,b) memset(a,b,sizeof(a))
#define bug printf("*********\n");
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define ls tr[u].ch[0]
#define rs tr[u].ch[1]
#define FIN freopen(D://code//in.txt", "r", stdin);
#define debug(x) cout<<"["<
#include
#include
#include
#include
#include
#include