模拟二月金组,三个半小时AK。

USACO 2019 Feburary Contest, Gold T1

题意:给定一棵树,每个点有点权,每次可以进行以下操作之一:

  • 更改一个点的点权
  • 求某条路径上的点的点权的亦或值

思路:这这这。。。金组什么时候第一题都是树链剖分了。。。

这题是个树链剖分的模板题。(但是我捣鼓了好久。。。

首先将原树进行树链剖分,将每一个节点分在一条重链内。然后链与链之间用轻链连接。

对于操作1,我们只用将这个点的值在\(BIT\)中修改即可。

对于操作2,我们这样处理:

首先我们假设\(u\)和\(v\)中\(u\)所在重链的头的深度大于\(v\)所在重链的头的深度。

那么我们从\(u\)跳到\(u\)所在重链的头时就不会忽略\(u\)和\(v\)的\(lca\)。

(这边很重要,我就是第一开始只考虑了\(u\)和\(v\)的深度比较,然后只过了样例,其它点一个没过。。。

将\(u\)跳到\(u\)所在重链的头的父亲,并且将答案加上[\(u\)所在重链的头,\(u\)]这段区间的亦或和。

然后迭代处理即可。

USACO 2019 Feburary Contest, Gold T2

题意:给一个\(1..n\)的排列,问这个排列的最长满足以下要求的前缀的长度:

如果我们按照顺序从第一个数遍历,每一个数有两种选择:

  1. 将这个数放在某个已有栈的栈顶
  2. 将这个数放在所有栈右侧新建的一个栈的栈顶

中间可以不限次拿走现存所有栈中最左的那个的栈顶的数。

然后要求是让每次拿走的数最终能按大小排序。

思路:首先肯定是二分最长前缀辣

\(check\)的时候是这样做的:

每次找到栈顶比当前取的数大的第一个栈,把当前的数压到栈顶里,因此可以证明栈顶大小从左向右单调上升。

然后中途看最左栈顶是不是当前没拿到的最小数,如果是则将它弹掉。

然后就好辣(这题比第一题简单好多好多。。。

USACO 2019 Feburary Contest, Gold T3

题意:给\(n\)个矩形,可以再画两个互不相交的,求最大的被\(k\)个矩形覆盖的面积。

思路:(这题意怎么这么简单。。。

首先我们通过差分算出每一个点被多少个矩形覆盖了,然后每一个新画的矩形所能做出的最大贡献就是它覆盖的面积中被\(k-1\)个覆盖的\(-\)被\(k\)个覆盖的。所以我们可以通过\(dp\)预处理出\([[0,200],[0,200]]\)的一个删掉上面\(i\)行的子矩形中新画一个所能构成的最好情况,同理算出删掉左边\(j\)列的最好情况,枚举第一个矩形,然后第二个矩形所能造成的贡献都预处理好了,直接用即可。

04-17 07:36