入门OJ 4246: [Noip模拟题]中位数

Posted forth

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了入门OJ 4246: [Noip模拟题]中位数相关的知识,希望对你有一定的参考价值。

题目

Description

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

Input

第一行为两个正整数n(n<=100000)b(1<=b<=n),第二行为1~n 的排列。

Output

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

Sample Input

7 4
5 7 2 4 3 1 6

Sample Output

4

样例解释:{4}, {7,2,4}, {5,7,2,4,3}和{5,7,2,4,3,1,6}。

题解

类似于计数排序的方法

代码

#include <iostream>
using namespace std;
int n, b, ans, left_right[2][200010];
int main(int argc, char **argv) {
    scanf("%d %d", &n, &b); 
    left_right[0][n] = 1;
    for (register int i(0), a, s(n), right(0); i < n; ++i) {
        scanf("%d", &a);
        if (a != b) s += a > b ? 1 : -1;
        ++left_right[right |= a == b][s];
    }
    for (register int i(0); i < 2 * n; ans += left_right[0][++i] * left_right[1][i]);
    cout << ans << endl;
    return 0;
}

以上是关于入门OJ 4246: [Noip模拟题]中位数的主要内容,如果未能解决你的问题,请参考以下文章

入门OJ 4242: [Noip模拟题]删除

入门OJ 4192: [Noip模拟题]黑魔法师之门

17.10.02

begin.lydsy 入门OJ题库:11011102:那些四位数那些四位数之二

NOIP模拟赛beautiful 乱搞(平衡树)+ST

17.10.04