【未解决】2104:K-th Number

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);
	}
}

猜你喜欢

转载自blog.csdn.net/always_ease/article/details/81147459