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