E题 两数之和做法
给定一个数组,求切两刀的方案数,使得三段中都至少有一个正数,且每段的和都相同
先求总和tot,然后判tot%3是不是等于0,不是则无解
有解时,我们选择枚举第二段的终点,两数之和的思路,哈希表维护第二段的起点个数
遍历到一个下标i时,首先右侧的所有数之和必须是tot//3,其次还要正数的个数大于0,这两都可以用逆序遍历维护后缀预处理出来
然后正向遍历,维护正数的个数cnt,前缀和pre
去哈希表中找pre-tot//3那一项即可
现在的问题是,怎么保证这两段的正数个数都大于0?
只需要cnt>1,然后哈希表里映射的是个名次树,进去以后找小于cnt的数的个数即可
优化一下,其实相比普通的两数之和,这题只不过有一些前缀的cnt和当前的cnt相同,导致了我们多统计了,那我们干脆再开一个哈希表,用来统计cnt相同的情况,把这些减掉不就好了吗
map套名次树的做法:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=73608483
两个map的做法:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=73625210