hdu2019多校1
2019 Multi-University Training Contest 1
Problem B Operation
题意
有一个序列 $a$,刚开始长度为 $n$。一共 $m$ 次操作,共两种操作:
1,询问在区间 $[l,r]$ 中选一些元素使得异或和最大。输出异或和。
2,在该序列结尾添加一个数。
$n,m\leq 5\times 10^5,0\leq a_i < 2^{30}$
题解
一个很显然的做法是线段树维护线性基合并,时间 $O(n\log^2w\log n)$,其中 $w$ 为 $a_i$ 的位数。但是显然过不去。
因为只是从结尾加一个数,考虑维护前缀的线性基。
但查询的时候还需要知道线性基里的数是否满足它的下标比 $l-1$ 大。
这时候可以在线性基里记录第 $i$ 位的下标 $p_i$。
那么插入的时候贪心,如果遇到一个下标比它小的数,那么把 $p_i$ 和值替换,然后拿原来的数继续往下贪心即可。
询问的时候判断一下 $l\leq p_i$ 就可以了。
时间复杂度 $O(n\log w)$。
Problem D Vacation
题意
$n+1$ 辆车,每辆车有长度 $l$,车头到终点距离 $s$,最大速度 $v$。模拟整个过程,一辆车无法超过另一辆车,接触后只能以前面的车的速度行驶。问第 $0$ 辆车的车头通过终点的时间。
$n\leq 10^5,l_i,s_i,v_i\leq 10^9,s_i\geq s_{i+1}+l_{i+1}$
题解
最后 0 车通过终点的时候肯定是与前面一堆车一起的,枚举最前面的车是哪一辆,计算出通过时间,取最大值即为答案。
时间复杂度 $O(n)$
Problem E Path
题意
一个有向图,问需要割哪些边,使得 $1$ 到 $n$ 的最短路变大。一个方案费用为边权之和。输出最小费用。
题解
建出最短路图,然后跑最小割即可。
Problem F Typewriter
题意
给一个字符串 $s$,有两种操作:
1,花费 $p$ 在当前字符串后添加一个字母。
2,花费 $q$ 在当前字符串后添加一个当前字符串的子串。
当前字符串刚开始为空串,求使得变为 $s$ 的最少花费。
$n\leq 2\times 10^5$
题解
容易想到 dp,设 $f_i$ 表示匹配到第 $i$ 位时的答案。
设 $j$ 为使得 $s[1,j]\in s[j+1,i]$ 的最大的 $j$。
对于每个 $i$ 求出了 $j$ 就可以 dp 了。
发现当 $i$ 增大时 $j$ 不减。
用 SAM 维护 $s[1,j]$ ,若 $s[j+1,i]$ 匹配不了,则把 $s_{j+1}$ 扔进 SAM 里,维护一下 $s[j+1,i]$ 在 SAM 中的位置以及是否匹配。
匹配位置最多往回跳 $n$ 次,最多往前加 $n$ 次。
时间复杂度 $O(n)$
Problem I String
题意
给一个字符串 $s$,构造一个字典序最小的,第 $i$ 个小写字母出现次数在 $[l_i,r_i]$ 范围内的子序列。
$n\leq 10^5$
题解
贪心,顺次考虑当前位能填的字母,从小到大枚举,判断是否可行的办法是先用序列自动机找到最靠前的那一位,然后记录每个字母是否出现的后缀和,再判断一下就可以了。
时间复杂度 $O(|S|\sum)$,其中 $\sum$ 为字符集大小。
Problem L Sequence
题意
一个长度为 $n$ 的序列 $a$,有 $m$ 次操作,每次操作一个 $k(k\in [1,3])$ ,则新的序列 $a$ 满足 $a’{i}=\sum{j=i-kx}a_j(k\geq 0)$
求出 $m$ 次操作后的序列,模 $998244353$。
$n\leq 10^5,m\leq 10^6$
题解
设该序列生成函数为 $A(x)=\sum_{i=1}^{n}a_ix^i$
那么一次操作相当于给 $A(x)$ 乘上一个 $\sum_{i=0}x^{ik}$
因此最后答案与操作顺序无关。
很显然的做法是多项式快速幂,比较卡常,好像过不了(反正当时没有过)。
那么考虑 $(\sum_{i=0}x^{ik})^m$ 等于什么。
由于 $(\sum_{i=0}x^i)^m=\sum_{i=0}\binom{m-1+i}{m-1}x^i$
那么 $(\sum_{i=0}x^{ik})^m=\sum_{i=0}\binom{m-1+i}{m-1}x^{ik}$
这样对于每个 $k$ 就只需要做一次卷积就可以了。
时间复杂度 $O(n\log n)$