题目链接:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3896
题目大意:给定一个只有1和-1的数列,求连续非负子序列的个数。(当然原题不是这么直白的,要适当转化一下)
分析:很困。。。脑袋不清醒。。。完全忘了树状数组(这个写起来很简单)。于是纠结之下用分治做的,时间复杂度和树状数组是一样的。
假设现在求数列a[s..t]中的非负子序列个数,记为f(s, t)。令mid = (s + t) / 2,f(s, t) = f(s, mid) + f(mid + 1, t) + 包含a[mid]和a[mid+1]的子序列个数。为了计算第三部分,先统计a[mid+1..t]的前缀和出现的次数,用t[i]表示和不超过i的总数,再计算a[s..mid]的后缀和,若某个和为sum,那么有(t - mid - t[sum - 1])个满足条件的子序列。分治时间复杂度可以表示为:
f(n) = 2f(n / 2) + O(n)
也就是f(n) = nlogn,和树状数组一样。绕了好大一圈啊。。。。。
#include
#include
#include
#include
#include
#include