【数论】【未解决】2104:K-th Number

本文探讨了在数组中寻找第k小元素的问题,并提供了一种基于快速排序的方法。此外,还讨论了该方法在面对大量查询时可能出现的超时问题,并提到了未来可能采用线段树等更高效的数据结构来解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2104:K-th Number:题目大意,a[1..n],有m个询问,每次询问区间a[i,,,j]内第k小的数

只是为了当作找第k大的数的练习,但是貌似还是超时了。在网上找貌似需要线段树,由于时间原因以后再研究吧。目前着重于基于快排的找第k大的数的技巧。

注意:两个(i<=j)的break判断不能少

超时代码:(但是通过了样例)

#include<cstdio>
#include<string.h>
using namespace std;
int n,m;
int a[100001],b[100001];
void solve(int low,int high,int k)
{
	int t=b[low],i=low,j=high;
	while(i<j)
	{
		while(b[j]>t)j--;
		if (i>=j) break;
		b[i]=b[j];i++;
		while(b[i]<t)i++;
		if (i>=j) break;
		b[j]=b[i];j--;
	}
	b[j]=t;
	if (j-low+1==k)
		printf("%d\n",t);
	else if ((j-low+1)>k)
		solve(low,j-1,k);
	else solve(j+1,high,k-(j-low+1));
}
int main()
{
	int i,j,k;
	scanf_s("%d %d",&n,&m);
	for (i=0;i<n;i++)
		scanf_s("%d",&a[i]);
	while(m--)
	{
		scanf_s("%d%d%d",&i,&j,&k);
		memcpy(b,a,n*sizeof(a[0]));
		solve(i-1,j-1,k);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值