菠萝の刷题记录1
有的时候。我看着我们班的那些牛牛牛们一起玩儿。会有点惋惜和后悔。如果我以前更努力一点。我是不是就能加入他们呢。
风吹起了从前
一道在模板上稍稍做了一些改动的trie树。主要难点在要用一个\(vector\)去存储每个节点有多少个符合要求的字符串
于是他错误的点名开始了
这道题要用双哈希
兔子与兔子
这是一个字符串区间哈希值板板。求区间字符串哈希数值建议string下标从1开始。
雪花 雪 雪绒花
这题昨天晚上就开始写了。结果没看数据范围以为所有雪花的程度小于等于\(9\)于是使用了\(char\)愉快地挂了\(45pts\)红温了。今天早上折腾了\(deepseek\)半个小时发现了问题后重新写。结果发现没有计算时间复杂度,用了双哈希+\(map\)超时了,又红温改成了单哈希+\(unordered map\)终于过了。
这道题目就是在哈希的基础上做了一点正反向操作。反正不难,如果要使用双哈希记得估算时间复杂度。
做哈希做的有点头疼。打算去玩耍一些最短路树状数组的题目(注意到我本来应该在弄初赛题目但实际上并没有)
贪婪的copy
这道题目还挺有意思的。
读题发现\(n\)和\(p\)给的格外的小还很疑惑。猜测出题人想要\(Floyd\)作为正解。但是我不太爱写那个。
所以一开始的思路是用\(dijkstra\)乱搞,把样例都过了结果发现测试点十挂九。红温了重新检查代码再读题。无果询问\(deepseek\)发现\(dijkstra\)的乱搞只能支持“恰好经过了\(x\)个点”的解法。但是本题不需要恰好。
本题的正解思路实际上是\(floyd+\)全排列。
但是还是想知道能不能用\(dijkstra\)去实现。遂又去找\(deepseek\),发现不只是状态定义的错误。我的乱搞本质上全是错的。这道题确实也可以用\(dij\)去实现,但是需要用状态压缩的思想十分麻烦,所以懒得写\(dij\)了直接尝试\(floyd\)的做法去了。写完对着样例调了调交了,发现死活编译不出来红温了。等了三分钟终于过了。
后来想了想如果加大数据是不是能把\(flo\)卡掉,结果自习分析时间复杂度发现\(dij\)的耗时实际上比\(flo\)要大很多,加大数据只能把两种做法都卡掉。
道路重建
开题很惊喜。因为发现这题的\(n\)依旧很小,从\(copy\)那里得知出题人1应该依旧想让我用\(floyd\)。
看了看题,发现这题的意思就是如果道路坏了边权照旧,道路没坏边权归零,然后跑一遍\(floyd\)就好啦。测样例一发过,结果评测挂了八个点。下载了一个样例出来瞄了一眼,发现我确实不太会使用\(floyd\):边是双向的,但是我的标记只标记了单向然后它挂了。
评估时间复杂度和各项事宜后发现\(dij\)应该也能做,只不过好像由于加边的方式不同代码实现方式不同,\(dij\)会比\(flo\)要麻烦一点。
感觉这样刷题对于我来说刚刚好,既能学到东西也确实有必要且很舒服,刷绿青太痛苦了。我决定这样水题知道洛谷黄题通过量\(>200\),然后再开始刷绿。
Sweet Butter 香甜的黄油
本题看完题目发现它是一个裸\(floyd\),不太想做了。结果看了眼讨论区发现这道题似乎另有玄机,所以就敲了代码。
交上去挂了好多个点,回来一看发现\(flo\)三层循环不是\(<=\)奶牛数而是\(<=\)牧场数。但是这题奶牛数给的是\(n\)。改了就过了。也没发现玄机。
然后打算去写一点最小生成树的黄。我是不会告诉你我现在在逃避数学黄题和贪心黄题的。
Cherries
惊讶地发现自己好像已经忘记了最小生成树的原理。不过好像也没什么关系。
读题读了很久,不过想做法没花很长时间。因为\(kruskal\)的实现方式就是将边排序,又意识到最终的最小生成树一定会有\(n-1\)条边,那么就先把长度为\(1\)的边能用的都用上,后面再用长度为\(2\)的补充即可。
又想了一下如果实在场上做,如何识别出来是最小生成树。这道题并不是一个很难看出来是图论的题目,樱桃为点,糖线为边。“使得每对樱桃通过糖丝直接或间接相连,并且甜点的含糖量最小”这句话其实一眼最小生成树了,并不是很难识别。
聪明猴
题目看完之后就像出来了做法且确定会对,所以打算口胡一些不写代码。先对各个坐标建立最小生成树,统计最大边权然后和每个猴子的跳跃能力进行对比即可。想了想要不还是写吧。毕竟我好像还要通过两百题。
写完对着样例调了调过掉之后就塞到评测机了去了,结果发现全挂了。询问\(ds\),发现是变数的变量名填错了。由于最小生成树只能在边和点上做文章,所以要注意一点不要填错变量名了。
如果是最小生成树的考题,所有的边都是双向的。这是一个比较好的切入点。
繁忙的都市
开题后盯着题目干瞪眼了一会儿觉得是一道板子,但是最大的道路分值尽量小又让我感觉要用二分。遂又干瞪眼了一会儿,依然认为是板子,所以就进行了尝试。结果确实是板子。感觉出题人可能一开始想出一个二分的习题,结果最后发现最小生成树能直接做(?
最后再做一题最小生成树,然后就开别的普及算法。
网络
还是板子,感觉如果板子就是黄的算法想要有提升应该练绿。
接着连一点搜索。先开广度优先搜索。我感觉已经有\(n\)年没打过\(BFS\)了。
黑白棋游戏
很久没做了,感觉不会估算复杂度了。那就先把代码打出来再练一下吧。感觉代码也不太会打,看看题解好了。
稍微喵了眼题解发现好像不是道简单题。实现有点点复杂的。不是!等一下!它是到绿题我点错了。但是感觉都了解了做法的话……那写一下也行。
这道题目主要就是状态压缩+\(BFS\),由于用了状态压缩所以交换棋会有点复杂。
关于如何想到状态压缩和\(BFS\):因为只有\(0\)和\(1\)嘛,而且个数\(\le16\),如果比较熟悉应该是能在不长的时间内找到状态压缩的。如何想到\(BFS\)?一般我们有一套比较套路的想法:
1.最短路径且边权为\(1\)(由于\(BFS\)的实现方式,它天生就适合,或者说它就是为这种题目而生的)
2.状态有限,可以明确表示(比如棋盘,字符串,图)
3.状态转移是可以确定,可以枚举的
这么一看感觉\(BFS\)其实和动态规划有点相似啊。
还有就是我觉得哈希和状态压缩本质上挺像的。
这种状态压缩的题目调起来真的特别麻烦……(疲惫)。我c了。
调出来的一点点错误:
1.如果说有一个循环里有多个互不相关的判断,不要因为有一个判断不满足条件无法继续进行这个判断力的内容就直接\(continue\)掉,后面的判断还要进行。(这种错误真的很难调试!!!)
2.在使用位运算的时候尽量多加括号,因为位运算的优先级无法直接确定(当然如果对代码语法很熟悉当我没说)
3.有的时候在位运算中可以直接使用异或而不是麻烦的加加减减
代码里的一点点可以优化的点:
1.其实在去交换棋子的时候可以只考虑向下交换和向右交换
关于如何记录棋子交换路径:对于每个状态,记录前驱状态即可
另:

猫
这道题目我在没有理解题意的时候就搓出了正解。事实上而言,这道题目真正的题意其实不太好理解。它想让你这么想:当两个拉扯一个网的两个点,这两个点之间有很多路径连接彼此,那么最终被扯到紧绷的只有最短的那一条路径。
但事实上你不理解它想让你干什么也可以模糊地感觉到题意:它想让你求两点之间的路径最大值,且所有边权为\(1\),那么就可以直接考虑\(BFS\),当然,好写的全源最短路\(floyd\)也非常好写。
但是我的\(BFS\)一开始炸了。这是因为我确实不太记得\(BFS\)的写法,然后用了\(dijkstra\)的写法。
\(dijkstra\):出队后标记,允许多次入队(更新在优先队列中的边权)。
\(BFS\):入队后标记,不允许多次入队(入队即最短,再入队会出错)。
医院设置
没想出来。看题解。发现自己是\(shaber\)。红温没再看题解,去尝试乱搞。
乱搞失败,发现理解错题意了。红温。调调调,过了。
星际旅行
另:

这道题目似乎并不太难,只是把\(m\)道传送门看成边即可。对于每个点用\(BFS\)去统计它到达别的点需要多少边,最后统计即可。
关于二位小数四舍五入:
printf("%.2f",sum1);
又是毕业季
这是一道数学题。不难发现最后找到的\(x\)在\(1\) ~ \(n\)个数中一定会存在\(x,2x,3x…kx\)
而我们需要尽量大的\(x\),所以最后的答案是\(n/k\)(向下取整)
^^本文来自博客园,作者:Baltic,转载请注明原文链接呀喵☆*: .。. o(≧▽≦)o .。.:*☆:https://www.cnblogs.com/Baltic/p/21798312
浙公网安备 33010602011771号