给定一个长度为

定义:

: 询问 中的第 大的数字

第一行一个整数 ,表示测试组数。
对于每组数据,第一行输入两个整数 ,20000  , 100000  表示序列的长度, 表示询问个数。
接下来一行是 个整数31   , ,表示序列。
接下来 行,每行两个整数
<=    ,

每组数据对于每个询问输出一行,若 的元素个数小于 ,输出 ;否则输出

复制
1
5 2
2 5 3 4 1
2 4
2 1
-1
 3
解法:
1 预处理,对于每一个数字我们都根据题意进行保存,应该复杂度n*logn
2 排序
2.1 k大于n,s==1 数字最小也>=1,输出a[0]
2.2 k<=n k的序列不足S,输出-1,可以的输出保存值
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 #define ULL unsigned long long
 5 vector<int>Ve[52345];
 6 int a[52345];
 7 bool Vesort(int x,int y){
 8     return x>y;
 9 }
10 int main(){
11     int t;
12     cin>>t;
13     while(t--){
14         int n,m;
15         for(int i=0;i<=52345;i++){
16             Ve[i].clear();
17         }
18         scanf("%d%d",&n,&m);
19         for(int i=0;i<n;i++){
20             scanf("%d",&a[i]);
21         }
22         for(int i=1;i<=n;i++){
23             for(int j=0;j<n;j+=i){
24                 Ve[i].push_back(a[j]);
25             }
26             sort(Ve[i].begin(),Ve[i].end(),Vesort);
27         }
28         while(m--){
29             int k,s;
30             scanf("%d%d",&k,&s);
31             if(k>n){
32                 if(s==1){
33                     printf("%d",a[0]);
34                 }else{
35                     printf("-1");
36                 }
37             }else{
38                 if(Ve[k].size()<s){
39                     printf("-1");
40                 }else{
41                     printf("%d",Ve[k][s-1]);
42                 }
43             }
44             cout<<endl;
45         }
46     }
47     return 0;
48 }

 

相关文章: