跳转至

2021牛客暑期多校训练营5

排名 当场过题数 至今过题数 总题数
18/1284(校内3/21) 8 11 11

A

upsolved by YZW

题意

给出 \(n\) 个点 \(m\) 条边的 仙~人~~掌~~~ 🌵

\(q\) 组询问,每组询问给出三个点 \(c,d,l\),求仙人掌上的一个点 \(x\) 使得:

  • \(x\)\(c\)\(d\) 的某条最短路径上;
  • \(x\)\(c\)\(l\) 的某条最短路径上;
  • \(c\)\(x\) 的距离最大。

\(1\leq n,q\leq 10^5\)\(n-1\leq m\leq {3\over 2}(n-1)\)

题解

考虑树的做法,直接求 LCA 分类讨论(\(c\)\(\text{LCA}(d,l)\) 子树外?子树内:更靠近 \(d\) 还是 \(l\)?),对应的 LCA 就是答案了。

对于仙人掌,建立圆方树,如果按树的做法找到的 LCA 是圆点就是答案了,不然找到的 LCA 是环,需要继续处理。

可以很简单地对于每个方点预处理对应环的顺序,从而可以轻易求得环上任意两个点的距离。通过倍增的方法,或者考察方点在圆方树上的 parent,可以求出三个点 \(c,d,l\) 出发走到环上第一个点分别是哪个点,设其分别为 \(c',d',l'\),需要注意这一步除了类似树的做法分类讨论外(因为这类情况都是两个点倍增 + 方点的 parent),还要特殊处理三组 LCA 相同的情况(这个情况三个点都要倍增)。

再根据环上距离推算答案,即要求 \(\text{dist}(c',x')+\text{dist}(x',d')=\text{dist}(c',d')\)\(\text{dist}(c',x')+\text{dist}(x',l')=\text{dist}(c',l')\),容易发现答案 \(x'\)\(c',d',l'\) 其一,验证取最大的即可。

复杂度 \(O(n\log n+q \log n)\)

B

solved by TYB&JLK

题意

\(n\)个箱子,每个箱子有一个球,是黑球和白球的概率都为\(\frac{1}{2}\),有两种操作,一种是花费\(w_i\)打开第\(i\)个箱子,二是花费\(C\)​得知当前没有打开的箱子中还剩下几个黑球,求知道所有箱子中放的球的颜色的最小期望花费。

\(n\le10^5,w_i,C\le10^9\),花费为小数。

题解

考虑花费\(C\)的操作,它仅有可能在一开始被使用一次,使用第二次无意义,而不在一开始使用得知的信息更少。所以策略一是不使用\(C\),花费为\(\sum w_i\),策略二是一开始使用\(C\),然后后面再打开若干个箱子,直到打开所有含有黑球的箱子。由于每个箱子等价,一定是将\(w_i\)从小到大排序后,开了一个前缀,枚举最后一个有黑球的箱子在第几个被开到,简单算一下概率即可。

C

solved by JLK&TYB

题意

两个人比赛\(n\)次,给定一个长度为\(n\)​的序列表示每次的输赢。类似于乒乓球等比赛的规则,如果规定赢的局数为\(i\),当两人中至少有一人的分数大于等于\(i\),且两人分差大于1的时候一局结束。对每个\(1 \le i\le n\)​,求出赢的局数。

\(1 \le n \le 10^6\)

题解

显然只能枚举\(i\),如果每次\(O(1)\)跳到下一局的结束位置,那么复杂度为\(O(nlogn)\)​,可以通过。

把赢看做1,输看做-1。

首先要找到有一个人的分数大于等于\(i\)​​的位置。这可以把1和-1单独拉出来,找到当前位置前面总共有几个-1和1,加上\(i\)个之后最小的位置就是要求的位置。

如果这一局还没结束,那么当前区间一定是-1,0或1。这个位置再到结束的区间和可能为+1,+2,+3,-1,-2,-3。对于每个位置都预处理出这六种情况的下一个位置。这可以一开始倒着扫一遍,维护每个前缀和最近的出现位置。

\(O(nlogn)\)

D

solved by JLK

题意

给定字符串\(A\)​和\(B\)​,要分别从中取出两个长度一样的子序列\(a,b\)​,而且\(\exists i,A_{a_i}\lt B_{b_i},\forall j\lt i,A_{a_j}= B_{b_j}\)​。求方案数。

\(1 \le |A|,|B| \le 5000\)

题解

实际上就是让\(a\)的字典序小于\(b\),不过题目这样说出来实际上比字典序更简单了。

预处理出两个数组,\(dp_{i,j}\)表示\(A[1..i],B[1..j]\)里选子序列,全部相同的方案数。\(DP_{i,j}\)表示在长度分别为\(i,j\)的序列里任意选相同长度的子序列的方案数。

枚举\(A_{a_i}\lt B_{b_j}\)的位置计算即可。

\(O(n^2)\)

E

upsolved by JLK

题意

给定一棵有\(n\)个点以1为根的树,每条边是or、and、xor三种位运算符之一。给定序列\(a\)

\(q\)​个询问,每次询问给出\(d,u\)​,当\(i\)点权值为\(a_i+d\times i\)​时,求出\(u\)点开始向下的所有链的值的or、and、xor和。链\(a,b,c\)\(a\)深度最小)的值为\((a??(b??c) )\)。??为边的运算符。

\(1 \le n,q \le 10^5,1 \le a_i \le 10^{18},0 \le d \le 100\)

题解

似乎是一种套路。

首先肯定是对于每个\(d\)​处理一遍所有点的答案。假设当前所有点的权值已经确定为\(A_i\)

对每个点维护\(dp_{i,0/1/2}\),表示从\(i\)开始向下的链的值的三种和。转移的时候就分析每一二进制位的贡献。

以边为or,要转移链值的xor和为例:

相当于求\((x|y)\oplus(x|z)\oplus\cdots\)\(x\)为当前点的权值,\(y,z\)为儿子向下的某些链的值。

如果\(x\)的某一位是0,那么完全可以忽略\(x\)的影响,就是\(y\oplus z\)

如果\(x\)的某一位是1,那么就没有\(y,z\)的影响,被异或的次数取决于子树大小。如果子树大小为奇数则要异或一次\(x\),否则不异或。

可以分类讨论九种转移,通过简单的位运算来实现。

\(O(nd)\)

F

upsolved by YZW

题意

给出一个 \(n\) 个点的凸包 \(A_1A_2\dots A_n\),求凸包内一点 \(P\),最大化 \(\min_{1\leq i\leq n}\{\angle A_iPA_{i\bmod n+1}\}\),输出该值。

\(4\leq n\leq 100\)

题解

由几何知识不难得到,对于两点 \(A,A'\),满足 \(\angle APA'\geq \theta\) 的点 \(P\) 构成一个圆,并且利用 \(\theta\) 可以轻易求得圆心与半径。

二分 \(\theta\),判断是否存在一个点在所有圆内。可行方法:逐一判断所有圆心和任意两个圆的交点是否满足条件。如果存在相离的两个圆则一定不存在满足条件的点。特别注意求圆的交点时两圆相含时是无交点的。

G

solved by YZW

题意

给出正整数 \(a,b,c\),求最小的 \(x+y\) 使得 \(\text{lcm}(a+x,b+y)=c\)

\(c\)\(\prod_{i=1}^n p_i^{q_i}\) 的形式给出。

\(1\leq n\leq 18\)\(2\leq p_i\leq 100\)\(1\leq q_i\leq 18\)\(1\leq a,b\leq c\leq 10^{32}\),保证 \(\sum_{q_i}\leq 18\)

题解

易见 \(a+x\)\(b+y\)\(c\) 的因数。

\(a+x\)\(b+y\)\(\text{lcm}\)\(c\) 当且仅当对于每个 \(p_i\)\(a+x\)\(b+y\) 二者至少其一满足:\(p_i^{q_i}\) 为其因子。

由此可以将 \(c\) 的一个因数对应 \(n\) 位二进制状态,第 \(i\) 位表示是否含有因子 \(p_i^{q_i}\)

枚举 \(c\) 的所有因数(最多 \(2^n\) 个)分别作为 \(a+x\)\(b+y\),对于每个状态 \(s\),记录 \(a+x\)\(b+y\) 达成这个状态的最小的 \(x\)\(y\),记为 \(x(s),y(s)\)

答案即为 \(\min_{s_1\wedge s_2 = 11\dots 1} \{x(s_1)+y(s_2)\}\)

可以设 \(\hat x(s)=\sum_{s\wedge s' = s} x(s')\),答案就是 \(\min_{s} \{x(s)+y(\sim s)\}\)

\(\hat x(s)\) 可以像 FWT 一样在 \(O(n2^n)\) 的时间内求出,听说这个叫 FMT。

时间复杂度 \(O(n2^n)\)

H

solved by TYB

题意

构造一个\(n\times m\)\(01\)​矩阵,使得不存在连续三个横着、竖着或者斜着的格子中都是同一个数。

\(n,m\le1000\)

题解

构造形如:

\(0011\)

\(1100\)

\(0011\)

的矩阵即可。

I

solved by JLK

题意

给定一个长度为\(n\)的序列\(A\),每次询问给定\(l,r,k\),要对\(0 \le i \lt k\)求出\(f(A[l-i+1..r+i-1])\)。其中\(f(S)\)为最长的连续权值区间。

例:\(f(\{1,2,4,5,6\})=3\)

\(1 \le n,q \le 10^5,1 \le A_i \le n,\le \sum k \le 10^7\)

题解

队友扔给我一个分块做法,看起来合理。实际上似乎叫“回撤莫队”?

因为普通数据结构并不好维护删除,故无法直接莫队或分块。如果只加入和撤销就很好维护。

所有询问按左端点分块。对于左端点位于一个块的询问\(q_i\)​,一起处理。从块的右端点开始向右扫,同时维护一个数据结构。然后碰到某个\(q_i\)的右端点之后,在左边暴力扫,加上需要的数。对于每个\(k\)​​也是暴力加上。然后再把所有操作都撤销,回滚到刚到\(q_i\)右端点的状态。

那么只需要一个可以撤销的数据结构。比赛时想到的是按秩合并的并查集,加入和撤回都是\(O(logn)\)​的。

实际上可以直接用类似链表的东西,因为是一段连续的区间。在左端点记录右端点的位置,在右端点记录左端点的位置。这样就可以\(O(1)\)维护了。

\(O(n\sqrt n+\sum k)\)

J

solved by TYB

题意

\(n\)个物品,第\(i\)个有参数\((x_i,y_i,z_i,v_i)\),在\([0,n-1]\)每个整数时刻获取一个未获取的物品,代价为\({x_i}^2+{y_i}^2+(z_i+t_iv_i)^2\),求获取所有物品的最小代价。

\(n\le300,z_i,v_i\ge0\)

题解

一开始被骗了,以为是个玄妙的贪心或者排序题,后来发现是裸的二分图最大权匹配,直接上KM。

\(O(n^3)\)

K

solved by YZW

题意

给出长为 \(n\) 的正整数序列 \(\{a_i\}\)\(m\) 次询问,每次询问给出 \(k\),询问满足子段极差严格大于 \(k\) 的子段个数。

\(1\leq n\leq 10^5\)\(1\leq m\leq 200\)\(1\leq a_i,k\leq 10^9\)

题解

对于每个询问,双指针+两个单调栈(单增,单减)扫一次序列即可求得:每个位置作为左端点时,满足条件的右端点数量,求和即为答案。

\(O(nm)\)

记录

开局HKBD都一发过,感觉良好。(0:41)

JLK写C,细节没处理好WA了。换YZW试一个J的贪心做法,WA两次。

之后改C过了(1:41)。

TYB说J是费用流,又T了。找到KM板子,遂AC。(2:40)

YZW写G,答案为0的时候没处理好,WA后AC(3:08)。

JLK用大复杂度做法写I,先T,优化后AC(4:38)。

然后YZW卡在F,一直交也没搞出来。

总结

JLK:对板子不够熟练。可能需要多做一些应用。 TYB:思维不够灵活,没看出来裸的二分图最大权匹配模型,看出来后又因为较少使用KM,选择了复杂度不够优秀的费用流,浪费了较多时间;然后抄模板的时候不太熟悉,最好还是手打一遍,变成自己的风格;需要学习一些基本的计算几何知识,至少做到会做签到题水平的计算几何题。

Dirt

C(-1)

G(-1)

I(-1)