短路
By matthew99
算法一
直接暴力 dfs,复杂度指数级,期望得分 10 分。
算法二
用最短路算法,复杂度
算法三
猜想只能往右或者往下走,然后做一个
算法四
在算法三的基础上进行对称性优化或者使用滚动数组,可以获得 50 分。
算法五
我们考虑假设我们要从左上角走到从外到内第
我们发现剩下来的
那么假设我们走到的最深的一层是第
这样,我们暴力枚举
时间复杂度
同样的我们也证明了算法三的正确性。
怎样,是不是一个超级送分大水题呢?
天路
By zhj, vfleaking,题解 By vfleaking
什么鬼?
嘿嘿嘿……vfk 又来出题玩玩了。事情是这样的,我和 zhj 发现了一个好玩的 idea,然而我并不知道怎么套个优雅的模型。这时 zhj 拯救了世界,于是就出出来了。
哎说实在的过去的一年给 CCF 出题有点心累,在自家 UOJ 上出题各方面还是爽多了2333……
依稀记得 NOI2016 讲题时我兀自地讲讲讲,台下纠结分数线的梦想们并没有多少热情听。后来当我看到分数线公布以及签约的现场有点百感交集,感觉给 CCF 出一次题的事情多,责任也好重……在 UOJ 上自己随便出出出题至少不会直接影响选手痛失金牌。
但愿我出的萌萌哒题目们都能让大家有所启发吧。
谜之声:怎么近似算法都出到 OI 里啊?这真 NOIP 难度?
咳咳客官别急,往下看。敢承诺这个近似算法非常 NOIP 向,并不是那种数学大不等式乱搞证 bound 型。
算法一
对于 1 号测试点,
大暴力!
你会使用 for 循环吗?
时间复杂度
算法二
对于 1,2,3 号测试点,
权值范围好大啊……
不要慌,你可以先枚举
你会使用 for 循环吗?
时间复杂度
算法三
对于 4,5 号测试点,
在算法二基础上,把每次扫一遍求最小值最大值改为 for 的时候乱维护维护就行了……
(而且
(感觉在 CCF 系列比赛这样送分会被选手喷的……hhh)
时间复杂度
算法四
对于 6,7 号测试点,
诶数据随机?
同学们你想到了什么!随机数据的前缀最小值只会变化
所以当我们固定左端点移动右端点时,区间内最大值与最小值至多只会变化
拿个单调栈维护一下……每次给对应的长度区间更新答案。
脑抽选手可以使用线段树,但其实由于答案单调,所以可以变成给一个长度的后缀更新更新,于是就能
可以获得 70 分。
算法五
还是数据随机的情况,观察数据我们注意到如果区间长度够长,那么答案就非常接近
所以我们设一个几百左右的值
同样可以获得 70 分。
算法六
好了好了所以之前的部分分跟近似算法都没什么关系……
这题应该怎么近似呢?你想,要是直接把权值除以一个大常数,做完之后再乘回来,看上去好像很近似!但是冷静冷静就会发现这样做出来是个绝对误差的,如果碰到
所以……相对误差,看上去很没头绪。
来来来先把近似算法扔进垃圾桶,来想想如果要你求出准确解,你可以怎么做。
一个思路是,我们应该是枚举一个
诶,那如果告诉你一个常数
……好像是可做的诶,因为最终的答案肯定是单调递增的,所以范围肯定是一段连续的
嗯很好,于是我们就可以每次找找
事实上,你只需要取:
现在还差一个想题时的直觉 —— 就是需要划分的段很少……只要注意到其实段数是
中间找到
这个算法其实说明,所有
噔噔!这题就做完了!相信比赛时很多选手都轻松 AC 啦~
(为什么一道水题的题解我能写这么长)
套路
By matthew99
算法一
枚举区间,再枚举区间内两个数统计这个区间的答案,再求出整个问题的答案。时间复杂度
算法二
用
时间复杂度降为
算法三:
注意到如果
时间复杂度为
算法四:
使用任何一种时间复杂度为
算法五:
我们考虑如果区间长度是
设一个常数
如果
如果
设
这是不是 UOJ 历史上最水的C呢,相信大家 AK 得非常的爽,作为出题人之一看到大家 AK 我也感到非常荣幸。
UPD:好像打脸了。