题意:给一棵树,边上有权值,有两种操作
1 a b f 输出f div(a、b两点间的路径权值和) 向下取整
2 a f 把第a条边的权值修改为f~~~
一开始就想到是树链剖分,但是被数据范围给吓到了,开了一个long double,,但是long double卡效率啊~~结果TLE
后来改为long long,特判一下如果大于1e18就直接赋值为1e18~~~避免溢出 AC了~~ 不能用long double声明变量啊~~~~
结果我去看别人的代码,有更加简单的方法~~
由于边的大小只会越来越小,一直小到1,可以利用这一点做文章~~
我们可以暴力往上搜索,且一路合并路径为1的边,(即更改fa[u]的值)
如son->father->grandfather这一条路径~~
当处理到son这个节点时,如果father->grandfather这条边的大小为1的话,那么可以直接把fa[son]=grandfather,跳过father~~~直接处理grandfather这个点~~~
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
树链剖分的代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include