“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛 H

给定一个长度为 的非负整数序列,下标为 , ,…,n

定义:sequence(K : 由下标为 的倍数组成的子序列,即下标为 , ,2 ,...,[n1/k]

query(K,S : 询问sequence(K 中的第 大的数字

第一行一个整数 ,表示测试组数。
对于每组数据,第一行输入两个整数 ,1<=n<=20000  , 1<=m<=100000  表示序列的长度, 表示询问个数。
接下来一行是 个整数0 ,1 ,..,n1 ,0<=<31   , i=0,1,,n ,表示序列。
接下来 行,每行两个整数K,
<=  10   , 1<=S<=

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

复制
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 }

 

posted @ 2017-07-13 23:29  樱花落舞  阅读(264)  评论(0编辑  收藏  举报