1 条题解

  • 0
    @ 2026-8-27 9:49:12

    以该数为中心,向右for一遍有多少个大于/小于该数的数

    大于就sumr++ 小于就--(因为是中位数,大于他的和小于他的数的数量一样)

    然后每次以sumr为下标的数++

    因为sumr可能小于零

    并且我比较懒

    所以就开了一个map

    万能的map!

    所以就直接mp[sumr]++;

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <map>
    using namespace std;
    map<int,int> mp;
    int n,b,a[100005],q,suml,sumr;
    long long ans;
    int main(){
        scanf("%d%d",&n,&b);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            if(a[i]==b) q=i;
        }
        for(int j=q;j<=n;j++){
            if(a[j]>b) sumr++;
            if(a[j]<b) sumr--;
            mp[sumr]++;
        }
        for(int i=q;i>=1;i--){
            if(a[i]>b) suml++;
            if(a[i]<b) suml--;
            ans+=mp[0-suml];
        }
        printf("%lld",ans);
    } 
    

    与其他题解的区别大概在于比较懒

    • 1

    信息

    ID
    2956
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    4
    已通过
    3
    上传者