ブルーブリッジカップ--アルゴリズム訓練区間k大数クエリー
13057 ワード
質問は、与えられたシーケンスを記述し、シーケンスのl番目の数からr番目の数のK番目の数がどれであるかを尋ねるたびに.
入力フォーマットの最初の行には、シーケンスの長さを表す数nが含まれます.
2行目は、与えられたシーケンスを表すn個の正の整数を含む.
3番目は、質問個数を表す正の整数mを含む.
次にm行、各行3個の数l,r,Kは、質問シーケンスが左から右へl番目の数からr番目の数まで、大きいから小さいK番目の数がどれであるかを示す.シーケンス要素は1から始まる.
出力フォーマットは合計m行を出力し、各行に1つの数で、質問の答えを表す.
サンプル入力5 1 2 3 4 5 2 1 5 2 3 2サンプル出力4 2データ規模と30%のデータに対して、n,m<=100;
100%のデータに対して、n,m<=1000;
k<=(r−l+1)、シーケンス中の数<=10^6を保証する.
入力フォーマットの最初の行には、シーケンスの長さを表す数nが含まれます.
2行目は、与えられたシーケンスを表すn個の正の整数を含む.
3番目は、質問個数を表す正の整数mを含む.
次にm行、各行3個の数l,r,Kは、質問シーケンスが左から右へl番目の数からr番目の数まで、大きいから小さいK番目の数がどれであるかを示す.シーケンス要素は1から始まる.
出力フォーマットは合計m行を出力し、各行に1つの数で、質問の答えを表す.
サンプル入力5 1 2 3 4 5 2 1 5 2 3 2サンプル出力4 2データ規模と30%のデータに対して、n,m<=100;
100%のデータに対して、n,m<=1000;
k<=(r−l+1)、シーケンス中の数<=10^6を保証する.
#include
#include
using namespace std;
int N;
typedef struct {
int i, j, k; // i~j k
}ask;
void quick(int *num, int left, int right)
{
if (left < right)
{
int i = left, j = right;
num[0] = num[left];
do
{
while (num[j] < num[0] && i < j)
j--;
if (i < j)
{
num[i] = num[j];
i++;
}
while (num[i] > num[0] && i < j)
i++;
if (i < j)
{
num[j] = num[i];
j--;
}
} while (i != j);
num[i] = num[0];
quick(num, left, i - 1);
quick(num, i + 1, right);
}
}
int fond(int *num, int beg, int len)
{
return num[beg + len-1];
}
void copy(int *num, int *test)
{
for (int i = 1; i <= N; i++)
test[i] = num[i];
}
int main()
{
ask ques[1001];
int num[1001],Q,test[1001];
cin >> N;
int i;
for (i = 1; i <= N; i++)
{
cin >> num[i]; //
}
cin >> Q;
for (i = 1; i <= Q; i++)
{
cin >> ques[i].i >> ques[i].j >> ques[i].k;
}
i = 1;
while (i <= Q)
{
copy(num, test); //
quick(test, ques[i].i, ques[i].j); //i~j ( - )
cout << fond(test, ques[i].i, ques[i].k) << endl; // k
i++;
}
system("pause");
return 0;
}