20220318刷题笔记
P4750
如果正着的矩形,显然可做,我们考虑斜着怎么做,首先这里有坐标转换公式,设坐标轴逆时针旋转 \(\theta\) 角,设原来坐标为 \((x,y)\),旋转之后的坐标为 \((x',y')\)
这里我们对斜着的矩形旋转坐标轴,注意到不用保证长度相等,因为这样会出现无理数,所以我们用 \((x+y,y-x)\) 来进行坐标变换。
在两个坐标系中分别做完之后,我们考虑合并两个坐标系。
像这样:
每个格子被我们分成 \(4\) 个三角形,而我们只需要考虑四个三角形哪些被覆盖了,注意到我们可以建立斜正方形与正正方形之间的坐标映射,然后分类讨论就可以。
AGC052B
自己最多只能想到如果是序列上的话,一次操作等价于交换前缀异或和。
如果是树上的话,我们给每个点设一个权值 \(a_i\),并且满足 \(a_u\ xor\ a_v\) 为 \(w\),接下来考虑一次操作实际上是交换这条边两边点的权值。
我们可以很快的构造出一组 \(a_i\) 为某个点到根上路径的异或和,这里假定 \(a_i\) 为根。并且似乎只有这样的一组解,如果我们假定根的 \(a\) 为 \(0\) 的话。
一个思路是在 \(b\) 中枚举根,然后看两棵树的权值是否为排列。
不过不用这样,我们在第二棵树中也向 \(1\) 做异或和,这样 \(x\) 到根的异或和实际上是它们向 \(1\) 异或值异或起来。
这个值可以求出来,因为 \(n\) 为奇数,所以我们直接把所有的值异或在一起,然后看这个值是否出现,以及异或完之后是否为排列即可。
P6071
这个题距离正解已经很近了,自己的思路错在分类讨论没有讨论全。
如果 \(l,r\) 中有些点是 \(p\) 的后代,而并不是全部,那么答案显然是 \(0\)。
现在考虑 \(lca\) 和 \(p\) 之间的关系,如果是祖先后代关系,如果 \(p\) 为祖先,那么答案为 \(p\) 到 \(lca\),如果 \(lca\) 为祖先,那么我们设 \(x\) 为深度最深的满足包含 \(l,r\) 中的点,并且是 \(p\) 的祖先的点,那么答案应该为 \(p\) 到 \(lca\) 的距离。如果不是祖先后代关系,那么答案就是 \(p\) 和 \(lca\) 之间的距离。
我们只需要线段树合并的时候用主席树记录每一棵线段树就可以询问每个节点的儿子信息,找到 \(lca\) 可以用重链剖分,因为信息区间可加,所以一段连续点的 \(lca\) 用线段树可以维护。找 \(x\) 可以在重链上条,如果一条重链满足条件,在上面二分即可。