2019暑假杭二day2测试总结

T1

题目大意

给出一个字符串\(S\),求出一个子序列,使原序列的每个字符出现且仅出现一次,且子序列的字典序最小。

sol

T1我得了90分,离奇\(WA\)了第一个点,正解比我的算法要简便地多,维护一个栈,对于每个字符,如果已经在栈内就直接跳过;否则,若栈顶字符比它大,且之后出现过,则弹出栈顶,以后在加进来(贪心),当不能弹时将当前字符加入栈内。最后,把栈从下往上输出即可。

T2

题目大意

有一个文本框和一个剪贴板,开始,文本框里有一个内容,剪贴板为空。每次可以进行三种操作:

  1. 将文本框的所有内容复制到剪贴板;

  2. 将剪贴板的内容粘贴到文本框;

  3. 删除文本框的最后一个内容。

\(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\)连边权为一的边,向\(i*x(i*x<=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\)列的方案数,没遇到障碍就只能往右走,遇到障碍就只能往上走,方案数叠加就行,可以用线段树加扫描线优化。代码细节比较多,我暂时还没实现。

posted @ 2019-08-23 21:09  胡昊天  阅读(162)  评论(0编辑  收藏  举报