您的位置:首页 > 其它

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

2017-07-13 23:29 316 查看
给定一个长度为n 的非负整数序列,下标为0 ,1 ,…,n−1 .

定义:sequence(K) : 由下标为K 的倍数组成的子序列,即下标为0 ,K ,2K ,...,[n−1/k]∗k

query(K,S)

: 询问sequence(K)

中的第S

大的数字

输入
第一行一个整数T

,表示测试组数。
对于每组数据,第一行输入两个整数n

,m

,1<=n<=20000

, 1<=m<=100000

,n

表示序列的长度,m

表示询问个数。
接下来一行是n

个整数a 0 ,a 1 ,..,a n−1 ,0<=a i <2 31

, i=0,1,…,n−1

,表示序列。
接下来m

行,每行两个整数K,S

0

<

K

<=

10 9

, 1<=S<=n

输出
每组数据对于每个询问输出一行,若sequence(K)

的元素个数小于S

,输出−1

;否则输出query(K,S)

样例输入1 复制
1
5 2
2 5 3 4 1
2 4
2 1


样例输出1
-1
3
解法:
1 预处理,对于每一个数字我们都根据题意进行保存,应该复杂度n*logn
2 排序
2.1 k大于n,s==1 数字最小也>=1,输出a[0]
2.2 k<=n k的序列不足S,输出-1,可以的输出保存值


#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define ULL unsigned long long
vector<int>Ve[52345];
int a[52345];
bool Vesort(int x,int y){
return x>y;
}
int main(){
int t;
cin>>t;
while(t--){
int n,m;
for(int i=0;i<=52345;i++){
Ve[i].clear();
}
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++){
for(int j=0;j<n;j+=i){
Ve[i].push_back(a[j]);
}
sort(Ve[i].begin(),Ve[i].end(),Vesort);
}
while(m--){
int k,s;
scanf("%d%d",&k,&s);
if(k>n){
if(s==1){
printf("%d",a[0]);
}else{
printf("-1");
}
}else{
if(Ve[k].size()<s){
printf("-1");
}else{
printf("%d",Ve[k][s-1]);
}
}
cout<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐