列表

详情


NC218870. k小数查询

描述

牛牛学会了可持久化线段树,于是他开始向牛妹炫耀。牛妹很不屑,那你能解决下面这道小数查询的问题吗:
给出长度为的序列,有多少对不同的整数对满足中第小的数是

输入描述

第一行三个整数
第二行个整数

输出描述

一行一个整数表示答案。

示例1

输入:

5 3 2
1 2 3 4 5

输出:

3

说明:

区间{[2,3],[2,4],[2,5]}{2}小的数都是{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;
}

上一题