[题解]luogu_P1627_中位数(排列乱搞

Posted superminivan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[题解]luogu_P1627_中位数(排列乱搞相关的知识,希望对你有一定的参考价值。

首先我们只关注大小数量关系,所以把小于b的设为-1,大于b的设为1,只要区间包含b且和为0即为合法

统计时用桶记录左和右边sum出现的次数,把左+右==0的乘起来记到答案里

都是比较套路的吧

#include<bits/stdc++.h>
using namespace std;
const int maxn=200009;
int n,b,a[maxn],p,ans;
int sum[maxn],lc[maxn],rc[maxn];
int main(){
    scanf("%d%d",&n,&b);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(a[i]<b)a[i]=-1;
        if(a[i]>b)a[i]=1;
        if(a[i]==b)p=i;
    }
    lc[n]=1;rc[n]=1;
    for(int i=p+1;i<=n;i++){
        sum[i]=sum[i-1]+a[i];
        lc[n+sum[i]]++;
    }
    for(int i=p-1;i>=1;i--){
        sum[i]=sum[i+1]+a[i];
        rc[n+sum[i]]++;
    }
    for(int i=-n;i<=n-1;i++){
        ans+=lc[i+n]*rc[-i+n];
    }
    printf("%d",ans);
}

 

以上是关于[题解]luogu_P1627_中位数(排列乱搞的主要内容,如果未能解决你的问题,请参考以下文章

[题解]luogu_P2824_HEOI2016排序(线段树/二分

[题解](背包)luogu_P4095 eden的新背包问题

bzoj1303[CQOI2008]中位数图 / 乱搞

[题解]luogu_P4886_快递员(点分治

[题解]luogu_P3313_旅行(树剖

[题解/模板]luogu_P3942_(树上覆盖问题