标签:数字 测试 sub scanf its i++ ... clear ret
给定一个长度为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 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 }
“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛 H
标签:数字 测试 sub scanf its i++ ... clear ret
原文地址:http://www.cnblogs.com/yinghualuowu/p/7163759.html