Luogu P3031 高于中位数

定义序列(x_i = f([H_i >=x]);;;;其中f(0) = -1,f(1) = 1),那么区间[i,j]满足条件当且仅当sum_j-sum_{i-1} > 0,即sum_j>sum_{i-1}

(g_d表示sum_{i-1}^{n} [sum_i=d] , pre_d表示在d前面满足sum[i]<sum[d]的i的个数)

考虑已求出(g_{1..k-1} , pre_{1..k-1}),现在要求(pre_k)

(sum_j > sum_{j-1}) , 由此可得(sum_j = sum_{j-1}+1) , 则(pre_j = pre_{j-1} + g_sum_{i-1} + 1 (1指sum_{i}))

否则(sum_j = sum_{j-1} -1) ,由此可得(pre_j = pre_{j-1} - g_sum_{i-1} + 1 (1指sum_{i}))

代码如下

#include<iostream>
#include<cstdio>
using namespace std ;
#define ll	long long
#define _ 1000005
ll sum[_] , num[_] , x,n,tmp,pre,ans; // num 即 g 数组 , pre使用滚动数组优化
int main(){
	cin>>n>>x ;
	for(int i=1;i<=n;++i){
		cin>>tmp ; 
		sum[i] = sum[i-1] + ((tmp>=x)?1:-1) ;
	}
	num[0] = 1 ;
	for(int i=1;i<=n;++i){
		if(sum[i] > sum[i-1]) pre += num[sum[i]]+1 ;
		else pre -= (num[sum[i-1]]-1) ;
		num[sum[i]]++ ;
		ans += pre ;
	}	
	cout<<ans<<endl ;
}
原文地址:https://www.cnblogs.com/tyqtyq/p/10864760.html