NOIP模拟 40

  考得更嘛也不是了。

  不过如果不犯任何低错的话..

  

  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);
    }              
}
能吃空512MB的代码

  感觉T2是MVT(...)

  虽然可以被一堆离线算法水过去..

  但是我向来不爱离线..

  所以我认真地打了在线

  

  首先我学了链并

  现有一些树上数据,他们代表一些节点到根的一条路径上所有点的贡献

  我们要查询一些特定数据的合并结果,比如一些链的覆盖,子树不同数问题

 

  将链底按dfn排序以后

    将每个链底到根的距离累加。(子树不同数里:对于同一种颜色,给每个点的权值+1)

    将相邻两点的LCA到根的距离减去。(给lca的权值-1)

  那么我们发现对于任意一个点

    如果他只在一个点(及其祖先链)上,他被加了一次

    如果他在多个点(或其祖先链)上,他被n个点加了n次,同时又被(n-1)个lca减了(n-1)次

  他的贡献总是只被计算一次

 

  于是链的覆盖便很好理解了,但是这子树不同数是怎么回事..

  

  那么其实子树不同数问题里,每个点上带的数据没什么意义,它是一种差分

  从树叶到根方向的差分。

  所以只有求和才有意义,一颗子树里所有点权值的和就是这颗子树里颜色的个数。

  因为保证了,一种颜色只被加了一次...

 

  这么看来这两个问题好像差不多,一个是前缀和的差分得到实际值,一个是差分的求和得到实际值。

 

  T3 我打了神奇的DP

  我不会证的那种

posted @ 2019-09-08 15:44  Yxsplayxs  阅读(140)  评论(0)    收藏  举报