zoukankan      html  css  js  c++  java
  • 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 ;
    }
    
  • 相关阅读:
    软件测试培训第9天
    软件培训第8天
    软件测试培训第7天
    软件测试培训第5天
    软件测试培训第6天
    软件测试培训第4天
    软件测试培训第3天
    MySQL复杂用法
    MySQL的基本语法
    VM虚拟机上安装Redhat
  • 原文地址:https://www.cnblogs.com/tyqtyq/p/10864760.html
Copyright © 2011-2022 走看看