该题解同步于我的博客
A
对于,直接开个桶统计即可。入门题目。
代码:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=41153707&scrollToDetail=1
B
对于,直接按题目模拟就好。每次两个指针扫一下就是
的了。整个加起来是
的复杂度。可以结合代码理解。
代码:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=41153710
C
对于直接copy代码然后完善一下头文件什么的就行了。
考虑这个是在干什么,其实就是求对于每个位置往前的前
大的数的和。
那么对于,直接删掉第三重循环(考虑如果不选这个数,可以直接直接从
转移,所以第三重循环完全多余)
对于,用一个数据结构动态维护前
大即可。(这里用
或者小根堆,都行)
复杂度
代码:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=41153712
D
对于,很明显是个
的算法..那么直接暴力枚举两个端点,然后暴力统计和取
即可。
对于,注意到这个矩阵的生成方式有点特别,把它写出来,就会发现一个矩阵的和是一段
乘上一段
,那么便可以省去统计两重循环,复杂度
对于,考虑优化
分的做法,30分的统计就是一个前缀和相乘的形式,那么要让它最大无非3种情况,正数最大
正数最大,负数最小
负数最小,正数最小
负数最大,第三种又可以分为正数最小在
中,正数最小在
中两种情况,于是维护前缀
和前缀
,分类讨论一下,就可以
解决了。
对于,既然是一段
乘上一段
,那么分别统计最大子段和和最小子段和即可。
最后根据的做法分四类情况讨论一下就好。这部分其实就是把
和
分做法综合起来而已。
复杂度
至于怎么算最小子段和?全部取反求最大子段和再重新重新乘即可。
代码:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=41153727