摘要: 给出n个点。 对每个点,询问它的子树中: 假设距离它为d的点有x个,求最大的x,并输出d。 如果有多个x相同,输出最小的d。 题解: 树上启发式合并。 用数组f维护当前节点子树内第i层的节点数。 数组Max维护当前节点子树内最大的节点数的层。 数组Ans维护当前节点的答案。 在转移时,Max和Ans 阅读全文
posted @ 2021-04-02 15:38 zlc0405 阅读(59) 评论(0) 推荐(0) 编辑
摘要: 给出一棵树,每个节点上有一个字符串。 每次询问子树x内的第y层儿子中不重复名字的个数。 题解: 树上启发式合并的过程中,数组f维护第i层中有多少种不同的字符串。 这里不太好直接维护,用set维护f数组即可。 #include<bits/stdc++.h> using namespace std; c 阅读全文
posted @ 2021-04-02 15:16 zlc0405 阅读(70) 评论(0) 推荐(0) 编辑
摘要: 给出一个树。 每次询问第x点有多少y代表亲。 两个点互为y代表亲当且仅当它们的第y个祖先相同。 题解: 每个点的y代表亲的答案就是: 先向上找节点的第y个祖先,这个祖先子树内的第dep+y层节点总数就是答案。 那么就可以先对询问离线,然后用倍增LCA找到每个点的第y层祖先,记录dep+y和询问编号这 阅读全文
posted @ 2021-04-02 14:43 zlc0405 阅读(51) 评论(0) 推荐(0) 编辑
摘要: 给出一棵树 对每个节点,询问有多少对p代表亲。 p代表亲是指:两个节点的第p个祖先相同。 题解: 离线处理询问 找出当前询问节点的第$p$个祖先,然后那个祖先下面1到p层的节点数量-1就是答案。 定义$f$存储当前节点子树内$x$层的节点总数。 阅读全文
posted @ 2021-04-02 00:23 zlc0405 阅读(43) 评论(0) 推荐(0) 编辑
摘要: 一棵以1为根的树,每个节点上都有1个字母,有m个询问。每次询问v对应的子树中,深度为h的这层节点的字母,能否打乱重排组成回文串。根的深度为1,每个点的深度为到根的距离。 #include<bits/stdc++.h> using namespace std; const int maxn=5e5+1 阅读全文
posted @ 2021-04-02 00:22 zlc0405 阅读(60) 评论(0) 推荐(0) 编辑