NC19913. [CQOI2009]中位数图
描述
输入描述
第一行为两个正整数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; }