T1
题目大意
给出一个字符串 S S S,求出一个子序列,使原序列的每个字符出现且仅出现一次,且子序列的字典序最小。
sol
T1我得了90分,离奇 W A WA WA了第一个点,正解比我的算法要简便地多,维护一个栈,对于每个字符,如果已经在栈内就直接跳过;否则,若栈顶字符比它大,且之后出现过,则弹出栈顶,以后在加进来(贪心),当不能弹时将当前字符加入栈内。最后,把栈从下往上输出即可。
T2
题目大意
有一个文本框和一个剪贴板,开始,文本框里有一个内容,剪贴板为空。每次可以进行三种操作:
- 将文本框的所有内容复制到剪贴板;
- 将剪贴板的内容粘贴到文本框;
- 删除文本框的最后一个内容。
设
f
(
x
)
f(x)
f(x)为地到
x
x
x个内容,最少需要的操作次数,求
∑
i
=
1
n
f
(
x
)
∗
192081
7
n
−
i
(
m
o
d
998244353
)
\sum_{i=1}^nf(x)*1920817^{n-i}(mod\space998244353)
i=1∑nf(x)∗1920817n−i(mod 998244353)
n
<
=
2000000
n<=2000000
n<=2000000
sol
难点在于求
f
(
x
)
f(x)
f(x),我发现这是一个最短路,于是以文本框和剪贴板为坐标,建出了
n
2
n^2
n2个点,边权都为1,对应一个操作,只得了40分。其实这题可以利用边权,建出
n
+
50
n+50
n+50个点,每个点
x
x
x向
x
−
1
x-1
x−1连边权为一的边,向
i
∗
x
(
i
∗
x
<
=
n
+
50
)
i*x(i*x<=n+50)
i∗x(i∗x<=n+50)连边权为
i
i
i的边,为了优化,可以只在
i
i
i为质数且不超过11的时候连边,当
i
i
i为合数时,可被几次复制粘贴凑出来,且答案更优。当
n
n
n大于11时可以玄学证明一定不优。建好图之后跑
s
p
f
a
spfa
spfa找单源最短路就行dijkstra居然更慢。
T3
题目大意
给定一个 n ∗ m n*m n∗m的矩阵,矩阵有一些位置是障碍(给出坐标),不能通过。现在要从 ( 0 , 0 ) (0,0) (0,0)走到 ( n , m ) (n,m) (n,m),只能往上走和往右走,求有多少种走发。两种走法不一样当且仅当一种走法的某个障碍在路径左边,另一种走法在路径右边 ( 1 < = n , m < = 1 0 9 ) (1<=n,m<=10^9) (1<=n,m<=109)。
sol
我开始只写出了无障碍的5分,正解是离散化后 d p dp dp,设 f [ i ] [ j ] f[i][j] f[i][j]为到分第 i i i行第 j j j列的方案数,没遇到障碍就只能往右走,遇到障碍就只能往上走,方案数叠加就行,可以用线段树加扫描线优化。代码细节比较多,我暂时还没实现。