zoukankan      html  css  js  c++  java
  • [CQOI2009] 中位数

    [CQOI2009] 中位数

    BZOJ
    luogu
    考虑(n^2)的暴力怎么写,对每个点记前缀和f,g表示1~i大于和小于b的个数,
    枚举左右端点(区间要包含b所在的点),查询这段区间内大于b和小于b的个数,相等就计入答案
    写完暴力正解就出来了
    考虑只枚举左端点,我们要求有多少右端点满足条件
    暴力的式子(f[r]-f[l-1]=g[r]-g[l-1]),那么直接开桶记录每个点的f-g,直接查就好了

    #include<bits/stdc++.h>
    using namespace std;
    const int _=2e5+5;
    int re(){
        int x=0,w=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
        return x*w;
    }
    int n,k,b,f[_],g[_],t[_];
    long long ans;
    int main(){
        n=re(),b=re();
        for(int i=1,a;i<=n;i++){
            a=re();f[i]=f[i-1];g[i]=g[i-1];
            if(a>b)f[i]++;
            else if(a<b)g[i]++;
            else k=i;
        }
        for(int i=k;i<=n;i++)t[g[i]-f[i]+n]++;
        for(int i=0;i<k;i++)ans+=t[g[i]-f[i]+n];
        printf("%lld
    ",ans);return 0;
    }
    
  • 相关阅读:
    设计模式第一次练习
    区间最大数
    魔方数
    螺旋数
    回文串
    最长单词
    指针的应用之学生成绩
    赛马
    突击队任务
    贪婪之骑士
  • 原文地址:https://www.cnblogs.com/sdzwyq/p/9852741.html
Copyright © 2011-2022 走看看