返回顶部

Codeforces Round #602 Div2 D1. Optimal Subsequences (Easy Version)

题意:给你一个数组a,询问m次,每次返回长度为k的和最大的子序列(要求字典序最小)的pos位置上的数字.

题解:和最大的子序列很简单,排个序就行,但是题目要求字典序最小,那我们在刚开始的时候先记录每个数的位置再排序,然后选出k个最大的数后在对位置从小到大排个序就行了(这题有个坑,第一次排序的时候记得把相等的数按位置小的排在前面).

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <stack>
 7 #include <queue>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <unordered_set>
12 #include <unordered_map>
13 #define ll long long
14 #define fi first
15 #define se second
16 #define pb push_back
17 #define me memset
18 const int N = 1e6 + 10;
19 const int mod = 1e9 + 7;
20 using namespace std;
21 typedef pair<int,int> PII;
22 typedef pair<long,long> PLL;
23  
24 int n,m;
25 int k,pos;
26 PII a[N];
27 vector<PII> tmp;
28  
29 bool cmp1(PII a,PII b){
30     if(a.fi==b.fi) return a.se<b.se;
31     return a.fi>b.fi;
32 }
33  
34 bool cmp2(PII a,PII b){
35     return a.se<b.se;
36 }
37  
38 int main() {
39     ios::sync_with_stdio(false);
40     cin>>n;
41      for(int i=0;i<n;++i){
42          cin>>a[i].fi;
43         a[i].se=i;
44      }
45      sort(a,a+n,cmp1);
46     cin>>m;
47      while(m--){
48          cin>>k>>pos;
49          tmp.clear();
50          for(int i=0;i<k;++i) tmp.pb(a[i]);
51         sort(tmp.begin(),tmp.end(),cmp2);
52         printf("%d\n",tmp[pos-1].fi);
53      }
54  
55     return 0;
56 }
View Code

总结:学会使用pair!!

posted @ 2020-04-26 12:24  Rayotaku  阅读(216)  评论(0编辑  收藏  举报