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\)的这么一个表
然后就可以发现一个神奇的结论
于是就可以水过这样一道题了
如果看表方式和正常人不一样那就是事故了
[HEOI2016]序列
线段树的一个\(\small 小\)问题
直接上std::sort
就是最暴力的暴力,
单次修改时间复杂度少说\(O(n\log n)\)
考虑优化:
就算是上非比较排序,整体时间复杂度还是\(\Theta(n^2)\)
所以,我们要引入一个手段:线段树维护\(0/1\)这样一个排序
升序排序等价于线段树区间覆盖\(0\)
降序就是区间覆盖\(1\)
配合二分答案使用即可在\(\Theta (n\log n)\)内解决战斗
二分答案其实就是查指定位置的数字
\(0\)表示猜小,\(1\)表示猜大
建树的时候相应的也要去这样建,否则白建