【數論】【未解決】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);
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章