C. Klee in Solitary Confinement
观察题目,发现暴力枚举区间不可行。
考虑一个经典套路:独立处理每个数字(考虑一个数字作为众数的时候,只有x和x-k会对答案造成影响,其他是不用考虑的)
于是,考虑把每个数字作为众数
下面是一个样例
1 2 2 3 5 k=2
枚举:
当3作为众数的时候,只有1(3-k)和3本身会对答案造成影响
然后还有一个经典的套路是贡献法
原数列其实就可以堪称
1 0 0 -1 0 (b序列)
意思就是说,如果选了1,等于贡献加一(多了一个三)
如果选了3,贡献就减一(少了一个3----3变成5了)
所以说,实质上,我们就是在求b序列的最大连续区间和
另外对于复杂度来说,我们是对每个数字分别处理,
比如说众数为2的时候,就只考虑2和0的位置有哪些,其他位置是不会对这个造成影响的
然后再考虑一下,每个数字实质上跑了两次(删除一次,增加一次)
所以实质上的复杂度就是(2*P),或者说(3*P-4*P)---(这个要看具体写法了,因为有的时候可能会出现重复的情况)
接下来就到了分岔口了
P的具体时间复杂度是多少呢
1.我的方法是使用一个线段树
该种方法P=nlogn
我当时没想到2那种O(n)的方法,套了一个可以对任意区间求最大连续字段和并可以修改数值的板子,大概是GSS3
当时忘记了这道题的区间是1-n随便取了
2.我昨晚还想到一种方法是类似跑一个长度无限大的滑动窗口,或者说小dp,查询一下最大连续字段和即可(就是dp)
注意:需要注意操作方式
比如说对3为众数,那得到遍历的数组实质是是一个
1 -1 (实质数组),这样才能保证复杂度是O(n)
该种方法P=n
3.方法其实很多,官方题解我还没看,但空气力学是用的归并来维护的这个最大连续子段和的,只要会归并就容易看懂,且前置思路就是我上面的说法
4.还有一种前缀和的方法,感觉挺牛的,推式子推

最低0.47元/天 解锁文章
705

被折叠的 条评论
为什么被折叠?



