bzoj2589 Spoj 10707 Count on a tree II

Posted paul-guderian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj2589 Spoj 10707 Count on a tree II相关的知识,希望对你有一定的参考价值。

题目描述

给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v),你需要回答u xor lastans和v这两个节点间有多少种不同的点权。其中lastans是上一个询问的答案,初始为0,即第一个询问的u是明文。

输入格式

第一行两个整数N,M。
第二行有N个整数,其中第i个整数表示点i的权值。
后面N-1行每行两个整数(x,y),表示点x到点y有一条边。
最后M行每行两个整数(u,v),表示一组询问。
数据范围是N<=40000 M<=100000 点权在int范围内 

输出格式

M行,表示每个询问的答案。
  • 题解

    • 树上莫队;
    • 如果不要求强制在线的话比较传统;
    • 强制在线有点麻烦:
    • 对树按深度分块,当一个点向下的深度超过$sqrt{N}$就分一块;
    • 这样分块保证了深度和块的数量在$O(sqrt{N})$内;
    • 预处理每个块的根对其他所有点的答案,这时$O(nsqrt{N})$的时间和空间的;
    • 考虑一个询问$u,v$如果在同一个块里则暴力查询;$O(sqrt{N})$
    • 否则假设$u$的根比$v$的根要深,否则交换;
    • 利用预处理得到$(root_{u},v)$的答案$O(1)$,暴力枚举$(u,root_{u})$的颜色$O(sqrt{N})$;
    • 可持久化块状链表记录$u$到链上的每个颜色出现的最大深度;$O(sqrt{N})$
    • 枚举的颜色没有出现过那么查询的最大深度一定小于$lca$的深度;

以上是关于bzoj2589 Spoj 10707 Count on a tree II的主要内容,如果未能解决你的问题,请参考以下文章

「SPOJ10707」Count on a tree II

[SPOJ10707]Count on a tree II

SPOJ10707COT2 - Count on a tree II

SPOJ10707 COT2 - Count on a tree II 树上莫队

BZOJ2588 Spoj 10628. Count on a tree

BZOJ2588 Spoj 10628. Count on a tree