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-1})\)

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

代码如下

#include<iostream>
#include<cstdio>
using namespace std ;
#define ll  long long
#define _ 1000005
ll sum[_] , num[_] , x,n,tmp,pre,ans;
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 ;
}

猜你喜欢

转载自www.cnblogs.com/tyqtyq/p/10864760.html