考得更嘛也不是了。
不过如果不犯任何低错的话..
T1 我神奇地想要缩减码量
比如想把尽量多的$b[i]-1$省掉
于是求$b[i]$的时候先减了个一
本来是正的
减完就忘了他应该是非负的了
于是线段树上查询[1,0]区间,大力RE
怒丢70
T2 我打了神奇的递归
大致:
int dfs(int x){ for(int i=head[x];i;i=nx[i]){ int t=to[i]; if(t!=f[x]) dfs(x); } }
感觉T2是MVT(...)
虽然可以被一堆离线算法水过去..
但是我向来不爱离线..
所以我认真地打了在线
首先我学了链并
现有一些树上数据,他们代表一些节点到根的一条路径上所有点的贡献
我们要查询一些特定数据的合并结果,比如一些链的覆盖,子树不同数问题
将链底按dfn排序以后
将每个链底到根的距离累加。(子树不同数里:对于同一种颜色,给每个点的权值+1)
将相邻两点的LCA到根的距离减去。(给lca的权值-1)
那么我们发现对于任意一个点
如果他只在一个点(及其祖先链)上,他被加了一次
如果他在多个点(或其祖先链)上,他被n个点加了n次,同时又被(n-1)个lca减了(n-1)次
他的贡献总是只被计算一次
于是链的覆盖便很好理解了,但是这子树不同数是怎么回事..
那么其实子树不同数问题里,每个点上带的数据没什么意义,它是一种差分
从树叶到根方向的差分。
所以只有求和才有意义,一颗子树里所有点权值的和就是这颗子树里颜色的个数。
因为保证了,一种颜色只被加了一次...
这么看来这两个问题好像差不多,一个是前缀和的差分得到实际值,一个是差分的求和得到实际值。
T3 我打了神奇的DP
我不会证的那种