跳转至

The 2021 ICPC Asia Shenyang Regional Contest

排名 当场过题数 至今过题数 总题数
8/? 10 11 13

A

**upsolved by **

题意

题解

B

solved by JLK

题意

\(n\)​​​个数,有\(m\)​​​个限制条件,形如\(a_u \oplus a_v=w\)​​​,求满足条件的可能的最小总和。

\(1 \le n \le 10^5,0 \le m \le 2\times 10^5,0 \le w \lt 2^{30}\)

题解

异或关系显然是可以传递的,用带权并查集维护限制条件,如果某个限制条件加进来成环并且导致这个环的异或和不为0,那么无解。

在有解的情况下,可以每个连通块分开考虑,再对每个位分开考虑,每一位一定贪心地取,选择这一位是0或1的个数较少的那个异或成1即可。

\(O(n\alpha(n))\)

C

solved by TYB

题意

略。

题解

以下将各种牌用其首字母代替。

注意到如果有\(2\)​个c和\(1\)个w,则可以造成无穷点伤害,在一回合内击杀怪物。一个直观的想法是设\(f[i][j][k]\)表示造成\(i\)点伤害,是否有w的状态为\(j\),c的数量状态为\(k\)\(0/1/\ge2\)​)。这样会有一个问题,就是在没有w之前,若手上的f和c不足以击杀怪物,那么应当等待w的到来再出牌。所以把状态第一维改为现在拥有的f+c的数量,并增加一维\(l\)表示是否有f(若没有,则c不能复制f造成伤害)。这样也会有问题,就是在有了w之后,抽到的w也会造成伤害。上面这两个问题分别是有/无w时的问题,所以我们可以这样:在没有w时,\(i\)表示牌的数量;在有w时,\(i\)表示造成的伤害。这样可以同时解决两个问题。还需要注意的是第一维\(i\)有上限,但当抽到的一直是c时这个值其实是无限的,且c的数量达到一定值时,抽到任意一个f或w都能取胜,需要特判掉这种情况。

D

upsolved by TYB

题意

\(n\times m\)的方阵,有\(k\)个人和出口,每个时刻每个人可以选择上下左右或者留在原地,但任意时刻不能有两个人在同一个格子里。人到达出口后可以视为离开了方阵,每个出口只能出一个人,但其他人仍可以经过出口。求所有人离开矩阵的最短时间,并输出每个人每个时刻的移动情况。

\(n\times m\le100,k\le100\)

题解

二分答案后网络流判断即可,建图比较显然就不再赘述了,输出方案直接随便找一条流量为\(0\)​​的出边即可。这题确实不难,场上没多少人过的原因可能是没时间了。

E

solved by JLK

题意

签到,略

题解

F

solved by TYB

题意

签到。

题解

略。

G

solved by YZW

题意

题解

H

solved by JLK

题意

给定一个无向图,求线图的最大权匹配。

\(3 \le n \le 10^5,n-1 \le m\le \min(\frac{n(n-1)}2,2\times 10^5)\)

题解

相当于就是每次选两个相交的边,得到两个边权之和的权值。要让这个总和最大。

一个结论是,如果一个连通块有偶数条边,那么一定存在一种方法能取完。

也就是偶数条边的连通块的边一定能全部取完。

那么就考虑奇数条边的连通块。在连通块里删一条边,如果删的不是割边,那么剩下的连通块一定是偶数条边,可以全部取完。如果删的是割边,就要考虑剩下两边连通块的边数的奇偶性。

这种情况肯定会切成两个偶数条边的连通块。因为如果是奇数,那么两边还要继续删,这样一定是不优的。

因此做一遍Tarjan,然后对每个连通块的奇偶性,每条边是否是割边讨论一下即可。

\(O(n+m)\)

I

solved by YZW

题意

题解

J

solved by YZW

题意

签到。

题解

略。

K

**upsolved by **

题意

题解

L

solved by TYB

题意

一个\(2n\)个点的完全图,删掉其中\(2n-1\)条边,这\(2n-1\)条边构成一棵树,求删边后的图完备匹配个数。

\(n\le2000\)

题解

考虑容斥,则要计算出至少用了\(i\)条树边的方案数。可以先树形DP求出选了\(i\)条树边匹配的方案数,然后乘上删掉这\(2i\)个点,剩下的点之间任意匹配的方案数,后者容易计算的。注意这种树形DP复杂度是\(\mathcal{O}(n^2)\)的。

M

solved by YZW

题意

给出一个串 \(S\),对于其所有非空前缀 \(S[1\dots i]\),求出字典序最大的子串,并求出其最早出现位置 \(l_i\dots r_i\)

\(1\leq |S|\leq 10^6\)

题解

Observation 1 对于 \(S[1\dots i]\),必然有 \(r_i=i\)

Proof 这是显然的,假设 \(r_i<i\),则 \(S[l_i\dots r_i+1]\) 字典序大于 \(S[l_i\dots r_i]\),矛盾。

Observation 2 \(l_i\) 单调不降。

Proof 这是显然的,假设 \(i<j\)\(l_i>l_j\),则 \(S[l_i\dots i]\) 字典序大于 \(S[l_j\dots i]\) 且前者长度更短,故 \(S[l_i\dots i]\) 字典序大于 \(S[l_j\dots j]\),矛盾。

Key observation 1 \(l_i>l_{i-1}\) 当且仅当存在 \(l_{i-1}\leq p< i\),记 \(\delta=p-l_{i-1},\ell=i-\delta\),满足:

  • \(S[l_{i-1}\dots p-1]=S[\ell \dots i-1] \quad(*)\)
    • 特殊地,当 \(\delta=0\) 时认为空串相等
  • \(S[p]<S[i]\quad(**)\)

满足条件的 \(p\) 对应的 \(\ell\) 构成集合 \(\{\ell\}\),则 \(l_i=\max\{\ell\}\)

根据 \((*)\),我们可以在 \(S[l_{i-1}\dots]\) 这个后缀上跑 KMP,\(S[i]\) 成为这个后缀的第 \(i-l_{i-1}+1\) 个字符。不妨记 \(\pi(i-l_{i-1}+1)\) 表示满足 \(S[l_{i-1}\dots i]\) 前缀后缀相等的最大长度,容易知道满足条件的 \(p\) 必然为 \(l_{i-1}+\pi(i-l_{i-1}), l_{i-1}+\pi(\pi(i-l_{i-1})), \dots\),这些 \(p\) 可以转移得到。

我们来讨论传递性。

Key observation 2 若 \(p\) 满足 \((*)(**)\),并且 \(\pi(p'-l_{i-1})=p-l_{i-1}, p'<i\),则 \(p'\) 也满足 \((*)(**)\)

Proof 记 \(p'\) 对应的 \(\delta'=p'-l_{i-1},\ell'=i-\delta'\)。当 \(S[i]>S[p']\) 时显然成立,考虑 \(S[i]\leq S[p']\) 的情况。由于 \(S[i]>S[p]\)\(S[i]\leq S[p']\),这说明 \(S[p']>S[p]\),从而可知应有 \(l_{p'}>l_{p'-1}\geq l_p\),但对于 \(l_{i-1}\leq j<i\) 应有 \(l_j=l_{i-1}\),这与 \(l_{i-1}\leq p,p'<i\) 矛盾。

Corollary \(l_i>l_{i-1}\) 的判据即是 \(S[l_{i-1}+\pi(i-l_{i-1})]<S[i]\)

类似 KMP 地,在满足 \(S[p]<S[i]\) 的条件下一直转移即可找到最小的 \(p\),对应最大的 \(\ell\),即为 \(l_i\)

注意到 \(S[l_{i-1}\dots p-1]=S[\ell\dots i-1]\),故 \(l_i\) 变动后,对于 \(1\leq j\leq i-l_i\),应有 \(\pi'(j)=\pi(j)\)。不需要对于新后缀 \(S[l_i\dots]\) 重新 KMP。

时间复杂度 \(O(|S|)\)

记录

JLK写E,RE一次后AC(0:03)。

TYB过F(0:18)。

YZW过J(0:30)。

JLK过B(0:40)。

TYB过L(1:02)。

JLK TLE一次后过H(1:36)。

TYB和YZW讨论M,JLK看其他题。

YZW过M(2:05)。

一起看GI,YZW想出了两题的解法,先写I。

JLK和TYB讨论C。

YZW WA一次后AC(3:31)。

TYB写C,写了一半发现问题,换YZW写G。

YZW过G(4:16)。

TYB和JLK在大量分类讨论修改后过了C(4:42)。

总结

Dirt

E(-1)

H(-1)

I(-1)