列表

详情


NC19913. [CQOI2009]中位数图

描述

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

输入描述

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

输出描述

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

示例1

输入:

7 4
5 7 2 4 3 1 6

输出:

4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 193ms, 内存消耗: 34860K, 提交时间: 2022-07-18 10:44:50

n,b = map(int,input().split())
a = list(map(int,input().split()))
f = [0]*n
num = [0]*n*2
for i in range(n):
    if a[i]==b:
        p = i
    elif a[i]>b:
        f[i]=1
    else:
        f[i]=-1
sum=0
ans=1
for i in range(p-1,-1,-1):
    sum+=f[i]
    num[sum+n]+=1
    if sum==0:
        ans+=1
sum=0
for i in range(p+1,n):
    sum+=f[i]
    ans+=num[n-sum]
    if sum==0:
        ans+=1
print(ans)

Python3 解法, 执行用时: 101ms, 内存消耗: 15680K, 提交时间: 2021-06-07 18:29:37

from collections import Counter

n, b = map(int, input().split())
a = list(map(int, input().split()))
m = a.index(b)
c1, c2, d1, d2 = Counter(), Counter(), 0, 0
for i in range(m - 1, -1, -1):
	d1 += 1 if a[i] > b else -1
	c1[d1] += 1
for i in range(m + 1, n):
	d2 += 1 if a[i] < b else -1
	c2[d2] += 1
ans = 1 + c1[0] + c2[0]
for k in c1: ans += c1[k] * c2[k]
print(ans)

C++(clang++ 11.0.1) 解法, 执行用时: 32ms, 内存消耗: 460K, 提交时间: 2022-10-08 14:09:13

#include<bits/stdc++.h>
using namespace std;
long long n,b,ans,c[2][200010];
int main () {
    cin>>n>>b; c[0][n]=1;
    for (long long i=0,a,s=n,ir=0;i<n;i++){
        cin>>a;
        if (a!=b) s+=a>b?1:-1;
        c[ir|=a==b][s]++;
    }
    for (long long i=0;i<2*n;i++,ans+=c[0][i]*c[1][i]);
    cout<<ans<<endl;
    return 0;
}

上一题