NC218870. k小数查询
描述
输入描述
第一行三个整数。
第二行个整数。
输出描述
一行一个整数表示答案。
示例1
输入:
5 3 2 1 2 3 4 5
输出:
3
说明:
区间第小的数都是。Python3 解法, 执行用时: 232ms, 内存消耗: 28596K, 提交时间: 2021-08-20 19:38:44
n, x, k = [int(u) for u in input().split()] a = [int(u) for u in input().split()] p = 0 for i in range(n): if a[i] == x: p = i ans = 0 b = [0 for u in range(n)] c = [0 for u in range(n)] cc = 0 for i in range(p, -1, -1): if a[i] < x: cc += 1 b[cc] += 1 cc = 0 for i in range(p, n): if a[i] < x: cc += 1 c[cc] += 1 for i in range(k): ans += b[i] * c[k - 1 - i] # print(b, c) print(ans)
C++ 解法, 执行用时: 24ms, 内存消耗: 2572K, 提交时间: 2021-09-21 13:55:27
#include<bits/stdc++.h> using namespace std; #define N 3000000 int n,x,k,m,pos,a[N],num[N],cnt,f[N]; int main() { scanf("%d%d%d",&n,&x,&k); for (int i=1;i<=n;i++) { scanf("%d",&m); if (m==x) pos=i; if (m<=x) a[i]=1; } num[0]=1; for (int i=1;i<=n;i++) { f[i]=f[i-1]+a[i]; if (i<pos) num[f[i]]++; } for (int i=pos;i<=n;i++) cnt+=num[f[i]-k]; cout<<cnt; }