tg 16

mine

题解
显然数据范围只允许我们\(\Theta(n)\)求解,那么也只能考虑\(DP\)了。

\(dp[i][j]\)表示到了\(i\)位置,当前选了\(j\)\(j\)分为五种情况,如下:

  \(\alpha.\)当前位置没有雷。

  \(\beta.\)当前位置左边有一个雷。

  \(\gamma.\)当前位置旁边有两个雷。

  \(\delta.\)当前位置有雷。

  \(\epsilon.\)当前位置左边有雷。

为方便,以上五种情况下面均以数字\(0\sim 5\)代替。

那么现在来考虑转移,首先是第一个位置,分为四种情况:

  \(\alpha.\)无雷:\(dp[1][0]=1\)

  \(\beta.\)旁边有一个雷:\(dp[1][4]=1\)

  \(\gamma.\)本身有雷:\(dp[1][3]=1\).

  \(\delta.\)\(?\)\(dp[1][0]=dp[1][3]=dp[1][4]=1\)(第一个位置不可能出现\(1,2\)两种情况)。

那么我们在来考虑过程中的转移,依然分类讨论(注意以下''中为题目中给出的棋盘的状态,而不是我上面列出的对于五种情况的编号):

  \(\alpha.'0':\)可以由\(0,1\)两种情况转移得来,即为:\(dp[i][0]=dp[i-1][0]+dp[i-1][1]\)

  \(\beta.'1':\)则还分两种情况,分别是\(1\)\(4\),那么式子为:\(dp[i][1]=dp[i-1][3]\)\(dp[i][4]=dp[i-1][0]+dp[i-1][1]\)

  \(\gamma.'2':\)只能由\(3\)转移得来,即:\(dp[i][2]=dp[i-1][3]\)

  \(\delta.'*':\)可以由\(2,3,4\)三种情况转移得来,即:\(dp[i][3]=dp[i-1][2]+dp[i-1][3]+dp[i-1][4]\)

  \(\epsilon.'?'\)包含以上所有情况。

最后来考虑如何统计答案,因为最后一位不可能是\(2\)\(4\)两种情况,所以答案即为:\(dp[n][0]+dp[n][1]+dp[n][3]\)

时间复杂度:\(\Theta(n)\)

期望得分:\(100\)分。

实际得分:\(100\)分。

小凯的疑惑

打表好题
打出一个\(10\times 10\)的这么一个表
然后就可以发现一个神奇的结论

\[ans=\frac{(n-1)\cdot(m-1)}{2} \]

于是就可以水过这样一道题了
如果看表方式和正常人不一样那就是事故了

[HEOI2016]序列

线段树的一个\(\small 小\)问题
直接上std::sort就是最暴力的暴力,
单次修改时间复杂度少说\(O(n\log n)\)
考虑优化:
就算是上非比较排序,整体时间复杂度还是\(\Theta(n^2)\)
所以,我们要引入一个手段:线段树维护\(0/1\)这样一个排序
升序排序等价于线段树区间覆盖\(0\)
降序就是区间覆盖\(1\)
配合二分答案使用即可在\(\Theta (n\log n)\)内解决战斗
二分答案其实就是查指定位置的数字
\(0\)表示猜小,\(1\)表示猜大
建树的时候相应的也要去这样建,否则白建

posted @ 2022-07-31 21:17  2K22  阅读(23)  评论(0编辑  收藏  举报