Vijos 1549题:中位数

来源:互联网 发布:人人商城v2 数据字典 编辑:程序博客网 时间:2024/06/13 16:12

描述

给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。

格式

输入格式

第一行为两个正整数n和b ,第二行为1~n 的排列。

输出格式

输出一个整数,即中位数为b的连续子序列个数。

样例1

样例输入1

5 4
1 2 3 4 5

样例输出1

2

样例2

样例输入2

6 3
1 2 4 5 6 3

样例输出2

1

样例3

样例输入3

7 4
5 7 2 4 3 1 6

样例输出3

4

限制

各个测试点1s

提示

第三个样例解释:{4}, {7,2,4}, {5,7,2,4,3}和{5,7,2,4,3,1,6}。
对于40%的数据,n<=300;
对于80%的数据,n<=25000;
对于全部的数据,n<=100000。

来源

NOI2009重庆市代表队选拔赛第一题


#include<cstring>#include<cstdio>using namespace std;const int MAXN = 100000 + 10;long int num[MAXN], f[MAXN], sum[MAXN][2];int main(){    int n, a, b, bri, ans = 0;    scanf("%d%d", &n, &b);    for (int i = 1; i <= n; i++) {        scanf("%d", &num[i]);        if (num[i] < b)            f[i] = f[i - 1] - 1;        else if (num[i] > b)            f[i] = f[i - 1] + 1;        else if (num[i] == b) {            bri = i;            f[i] = f[i - 1];        }    }    for (int i = bri - 1; i >= 0; i--) {        a = f[bri] - f[i];        if (a < 0)            sum[-a][0]++;        else if (a > 0)            sum[a][1]++;        else            sum[0][0]++;    }    for (int j = bri; j <= n; j++) {        a = f[j] - f[bri - 1];        if (a > 0)            ans += sum[a][0];        else if (a < 0)            ans += sum[-a][1];        else            ans += sum[0][0];    }    printf("%d", ans);    return 0;}
0 0
原创粉丝点击