2019 Multi-University Training Contest 1
Contest Info
[Practice Link](https://cn.vjudge.net/contest/313358#overview)
Solved | A | B | C | D | E | F | G | H | I | J | K | L | M |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
7/13 | Ø | Ø | - | O | O | Ø | - | - | Ø | - | Ø | - | - |
- O 在比赛中通过
- Ø 赛后通过
- ! 尝试了但是失败了
- - 没有尝试
Solutions
A.Blank
题意:
有\(n\)个盒子,现在要给每个盒子填数字,只能填\(\{0, 1, 2, 3\}\)这四个数字,现在有\(m\)条限制关系,表示\([l_i, r_i]\)区间内不同数字的个数必须是\(x_i\),问方案数。
思路:
考虑\(f[i][j][k][t]\)表示前\(t\)个数,\(\{0, 1, 2, 3\}\)四个数字最后出现的位置,并且强制令\(i < j < k < t\),那么可以枚举\(t + 1\)的转移。
考虑最后出现的位置可以是\(0\),所以转移的时候可以是等于的情况。
但是为了防止不合法的方案,可以自己再加入\(n\)条限制,保证一个位置上只有一个数。
然后对于限制的检查,强制在右端点检查即可。
B. Operation
题意:
支持两种操作:
- \(0\;l\;r\) 询问\([l, r]\)区间内的数选取任意个异或后的最大值
- \(1\;x\) 在序列末尾添加一个数
思路:
维护一个前缀线性基,插入的时候如果能替换就替换,因为替换之后\(L\)变大了,提供贡献的概率也更高。
查询的时候就从高位到低位,如果当前这位的下标大于\(L\),那么就异或上。
D.Vacation
题意:
有\(n\)俩车行驶在一条道路上,每辆车有车长\(l_i\),距离终点的距离\(s_i\),速度\(v_i\),不能超出,并且驶过终点后会依旧保持原状态行驶,问最后一辆车过终点的时间。
思路:
考虑所有车在驶过终点后会依旧保持原状态行驶,也就是说如果最后一辆车被堵着,那么它到堵着它的车队的最前面那辆车的距离减去这些车的车长是用它自己的速度跑的,其他距离都是用最前面这辆车的速度跑的。
我们可以枚举是哪辆车堵着,取最大值即可。
E. Path
题意:
一张\(n\)个点,\(m\)条边的图,破坏一条边的代价是它的权值,问最少的代价使得新图的\(1 \rightarrow n\)的最短路大于原图的。
思路:
先跑一遍最短路,考虑一条边有用当且仅当\(dis[u] +dis[v] = w\),把所有这样的边建图,跑最小割即可。
F - Typewriter
题意:
给出一个字符串\(S\),现在有两种操作弄出这个字符串:
- 花费\(p\)的代价添加一个任意字符。
- 花费\(q\)的代价复制一段已经出现的子串。
现在询问最小代价弄出这个字符串。
思路:
令\(f_i\)表示弄出前\(i\)个字符的最小代价,那么显然有一个转移是\(f_i = f_{i - 1} + p\)
我们注意到\(f_i\)是单调递增的。
那么对于第二种操作,我们显然是要找到一个最小的\(j\),使得\(s[j + 1, \cdots, i]\)在\(s[1, \cdots, j]\)中出现过。
那么我们可以维护这样一个\(j\)以及一个\(cur\)表示当前的\(i\)在\(s[1, \cdots j]\)构成的\(SAM\)上的匹配节点。
并且注意到\(cur\)可以尽可能的跳后缀链接跳到一个有更高概率被匹配到的节点。
什么时候才可以跳后缀链接?
当后缀链接代表的结点表示的后缀中的最大长度大于等于\(i - j - 1(s[j + 1, i - 1])\)那么就可以跳。
因为后缀链接中的后缀都是当前结点表示的所有后缀的后缀。
然后直到可以匹配出当前字符那么\(j\)就不用向右扩展了,我们找到的也是最小的\(j\)。
I. String
题意:
给出一个字符串,要求选出一个子序列满足以下要求:
- 长度为\(k\)
- 第\(i\)个字符的出现次数在\([L_i, R_i]\)范围内
- 字典序最小
思路:
可以从字典序这里找切入口,那么我们就可以从左到右贪心,先放小的,判断一个小的能不能放:
- 当前位的右边存在这个字符
- 跳到那个字符后,对于每个字符\(i\),在后缀中满足字符\(i\)的数量大于所必需的数量
- 剩余长度满足大于等于所必需的字符数量
K. Function
题意:
计算:
\(1 \leq n \leq 10^{21}\)
思路:
考虑\(\displaystyle \sqrt[3]{i}\)的取值只有\([1, 10^7]\),那么变换式子有:
并且注意到\(gcd(x, y) = gcd(x, x + y)\),那么所有\(> x\)的数都可以取模\(x\)后变成\([0, x - 1]\)范围内的数进行求\(gcd\)。
那么我们考虑这个式子\(f(n) = \sum\limits_{i = 1}^n gcd(n, i)\),打表小验证了一下这是个积性函数,可以线性筛。
并且注意到\([i^3, (i + 1)^3 - 1]\)这个区间长度\(- 1\)刚好是整除\(i\)的,并且\(i^3\)取模后\(+1\)为\(i\),那么把\(i^3\)单独提出来,剩下的都是完整的区间,直接算贡献即可。
这么做了之后,在本机跑的时间大概在\(4s\),交上去就\(T\)了,但是我们注意到我们算贡献的时候很多都是重复的,不妨将询问离线,排个序后放在一起做,就冲的很快了。。