The 2023 ICPC Asia EC Regionals Online Contest (I)
B. String
由于 \(T = s_1[i,j]+s_2[j+1,k]\),那枚举 \(T\) 的这个分界点 \(p\)。提前对 \(s_1\) 正串 和 \(s_2\) 的反串建两个 SAM,那么把 \(T[1,p]\) 放到 \(s_1\) 的 SAM 上去跑,跑到节点 \(u\),那么合法的 \(j\) 一定在 \(\text{endpos}(u)\) 中,\(T[p+1,len]\) 在 \(s_2\) 的反串 SAM 上去跑,也同理。
问题就转化为两个 SAM 的 link 树中每次询问 \((u,v)\) 两个不同 SAM 中的子树中颜色集合交的大小。颜色集合就是 endpos 集合。由于 endpos 集合中每个位置只会出现一次,所以可以看每种颜色对这个询问的贡献。设颜色 \(i\) 在两个 SAM 上节点分别是 \(x_i,y_i\),那么对于一个询问 \((u,v)\),若 \(x_i\) 在 \(u\) 子树中且 \(y_i\) 在 \(v\) 子树中就有一个贡献。转化为 link 树上的 dfs 序,就是 \(dfn_{x_i} \in [dfn_u,dfn_u + siz_u - 1] \land dfn_{y_i} \in [dfn_v,dfn_v + siz_v - 1]\)。离线做个二维偏序即可,复杂度 \(\Theta(n\log n)\)。
C. Multiply Then Plus
考虑询问 \(\max(x_i \cdot a+y_i)\) 时有用的 \((x_i,y_i)\),设 \(x_i \cdot a + y_i = t\),那么 \(y_i = -a \cdot x_i + t\),那么求最大的 \(t\) 可以看作用一条斜率为 \(-a\) 的直线,找到最大的截距使得直线上存在一个点。那么最大的 \((x_i,y_i)\) 肯定在所有点的上凸壳上,可以每次二分一个点满足 \(k_{i,i-1} > -a > k_{i,i+1}\) 找到。
考虑加入区间询问和修改,加入删除点可以通过线段树分治转为只加入,区间询问考虑用线段树维护区间凸壳,每次 pushup 的时候可以归并合并两边的凸包(只在这个区间所有点加完的时候合并),然后一个静态的区间询问可以找到 \(\Theta(\log n)\) 个区间的凸包上二分。复杂度 \(\Theta(n\log^3 n)\),无法通过。
考虑去掉二分,把询问按斜率排序,在线段树分治的叶子时,把一个询问挂到 \(\Theta(\log n)\) 个区间上,在线段树分治回溯时,当要破坏一个区间的凸包时,对这个区间上的凸包和询问做双指针,即可均摊 \(\Theta(1)\)。
复杂度 \(\Theta(n\log^2n)\)。
H. Range Periodicity Query
每次在字符串 \(S\) 的开头或结尾添加一个字符,设 \(S_i\) 为 \(S\) 长度为 \(i\) 时表示的字符串,那么 \(S\) 的存在长度为 \(p\) 的周期当且仅当在 \(S_p\) 到 \(S_{t_p}(t_p \ge p)\) 这一段连续的时间。
由于周期 \(= n - \text{border}\),那么二分出 \(t_p\),然后哈希判断就找出了这个区间。然后对 \(S_i\) 的 \(i\) 扫描线,对于每个序列的值 \(a_i\),在 \(a_i\) 时刻激活 \(a_i\) 这个位置,在 \(p_{a_i +1}\) 时刻关掉,询问离线,每次区间询问最小值即可。复杂度 \(\Theta(n\log n)\)。
J. Minimum Manhattan Distance
考虑一个圆外点到一个圆内对称两点的曼哈顿距离和一定是两倍到圆心的距离,那么找到离圆心期望距离最远的即可。由于两个圆在不同象限,那么这个点一定在另一个圆上的 \(4\) 个 \(45°\) 方向,都判一次即可。
K. Minimum Euclidean Distance
平面上一个点到一个圆内随机一个点欧几里得距离的期望值是 \(\dfrac{1}{2}r^2 +d^2\),其中 \(r\) 位半径,\(d\) 为点到圆心的距离。每次判断圆心是否在凸包内可以逆时针看 \(o\) 与 \(p_i,p_{i+1}\) 两个向量的叉积,都是正就在凸包里。不在凸包里就 \(\Theta(n)\) 枚举每个边界看点到线段的距离即可。复杂度 \(\Theta(nq)\)。
F. Alice and Bob
对于一个三个点 \((a,b,c) a \le b \le c\),可以表示为 \((x=b-a,y=c-b)\)
可以打表 \(SG\) 函数发现不合法的只有 \((0,x)\),其中 \(x\) 是二进制表示下结尾有偶数个 \(0\) 的数。可以用 01trie 从低位开始插每个数,然后查询时只用找到第一个不同的位置就是结尾 \(0\) 的个数了。复杂度 \(\Theta(n\log V)\)。
具体证明见 官方题解。

浙公网安备 33010602011771号