导航

CSP-J2020游记

CSP-J2020游记

T1

这其实就是道大水题,暴力就能过去。
我对其直接用模拟手动转换二进制,时间复杂度是\(\log_2n\)
然后我又写了个暴力对拍,希望没错吧

T2

这依然是道大水题,但考试中的我却没有注意到哪小的一批的成绩(成绩是不大于600的非负整数)
然后我就没有用桶去维护,写了个set差不多是O(\(n^2\))的时间复杂度,希望能水过70分

T3

这道题我一开始没什么思路,写了个栈暴力模拟后缀序列,每次修改,然后暴力求值
随后在考试的最后60分钟,我想到了一个把后缀序列处理成一个树,然后先求出值
然后对于每个修改,花\(log(n)\)的时间更新他的父亲节点,然后输出答案即可
希望这题我的正解别写炸吧

T4

这道题我想到了一个DP状态:

\[dp_{i,j,0}表示到达(i,j)这个点,由它左边的点转移过来的最大路径和\\ dp_{i,j,1}表示到达(i,j)这个点,由它上面的点转移过来的最大路径和\\ dp_{i,j,2}表示到达(i,j)这个点,由它下面的点转移过来的最大路径和\\ \]

这个DP状态已经清晰的告诉我们该从哪里更新当前的这个状态
我至今还不知道如何以确切的O(n^2)时间复杂度来完成这个DP
于是我就用了拓扑排序的思想,用队列装载着状态,用我为人人的转移方式来更新DP方程
希望这个时间复杂度能卡过数据

实际成绩

T3想的其实就是暴力,本来只有30分的,结果数据让我水成了50分
T2我的\(O(nlogn)\)暴力居然有85分,这数据也太水了吧
T4我的垃圾DP只有40分,还是太菜了啊
不幸中的万幸,我T1没炸

关于考试

这次考试中,我首先极快的写出了T1
然后看到T2,我并没有什么思路,于是就写了一个set维护当前的升序序列,然后O(n)暴力求
其实写到这一步很容易想到用桶取维护了,但是由于考试中的我比较紧张,还是没有想到正解
T3我首先想了一个暴力,然后又想到了建一棵树
如果没有!的情况这其实就是正解,因为树的层数最多\(log n\)
但是如果出题人刻意卡你的话,这就只有30分
T4想到那个方程后其实挺容易想到进一步的转移,但是由于考试中的我没有想到,所以只写了一个BFS转移状态

正解

T1

可以容易的发现,只有\(n\)为奇数的时候才会输出-1
\(n\)为偶数的时候,我们直接模拟二进制拆分就可
时间复杂度\(O(log_2n)\)

T2

我们可以发现"每个选手的成绩均为不超过\(600\)的非负整数",这就让我们很容易想到用\(a_x\)维护成绩x的出现次数
然后我们从大到小枚举成绩,找出分数线即可
时间复杂度\(O(600n)\)

T3

这道题其实想到建树后面就已经一片坦途,但我还是没有想到
我们处理一个数组记录当前这个节点的值改变后会不会引起这棵树的值的改变
然后直接通过数组判断答案即可

T4

\(f_{i,j,0}\)表示走到节点\((i,j)\)时用左上\(\Rrightarrow\)右下的方式转移过来的最大总和
\(f_{i,j,1}\)表示走到节点\((i,j)\)时用左下\(\Rrightarrow\)右上的方式转移过来的最大总和
然后\(nm\)转移即可

总结

这次考试我还是太紧张了,许多简单的解法都没有想到
以后训练的时候要注重思路一块,不要太注重于算法

posted on 2020-11-17 07:58  CHK666  阅读(110)  评论(0编辑  收藏  举报