zoukankan      html  css  js  c++  java
  • BZOJ 1303 中位数图 题解

    题面

    因为所求的是中位数,所以考虑改变原序列。把大于 b 的数全部变为 1,小于 b 的数变为 −1,等于 b 则为 0。问题就变为求存在几个包含 b的区间和为 0

    根据乘法原理,我们枚举每一个l[i],求出l[i]*r[-i]后累加到ans上;

    因为数组的下标不能是负数,所以把所有下标都加上100000;

    #include <bits/stdc++.h>
    using namespace std;
    int a[100010];
    int c[200010];
    int r[100010],l[100010];
    int mmap1[200010],mmap2[200010];
    int main()
    {
        int n,b;
        cin>>n>>b;
        int id=1;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            if(a[i]==b) id=i;
            if(a[i]>b) c[i]=1;
            else if(a[i]<b) c[i]=-1;
            else c[i]=0;
        }
        for(int i=id;i<=n;i++){
            r[i]=r[i-1]+c[i];
            mmap2[r[i]+100000]++;
        }
        for(int i=id;i>=1;i--){
            l[i]=l[i+1]+c[i];
            mmap1[l[i]+100000]++;
        }
        long long ans=0;
        for(int i=0;i<=200000;i++){
            ans+=mmap1[i]*mmap2[200000-i];
        }
        cout<<ans;    
    }
  • 相关阅读:
    office的高级应用
    python基础
    maven 资源导出失败问题
    单向环形链表和约瑟夫问题
    JDBC连接MySQL
    环形队列
    稀疏数组
    数据库锁机制和事务隔离级别总结
    context的简单应用
    JDBC基本使用方法
  • 原文地址:https://www.cnblogs.com/kamimxr/p/11507671.html
Copyright © 2011-2022 走看看