Codeforces 1262D Optimal Subsequences(BIT+二分)
Posted dd-bond
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 1262D Optimal Subsequences(BIT+二分)相关的知识,希望对你有一定的参考价值。
首先比较容易想到肯定是前k大的元素,那么我们可以先对其进行sort,如果数值一样返回下标小的(见题意),接下里处理的时候我们发现需要将一个元素下标插入到有序序列并且需要访问第几个元素是什么,那么我们可以离线处理,将所有询问存起来,每次插入一个元素的时候在对其进行查询,那么现在就变成了离线求第k大,那么可以直接上主席数,当然比较懒的做法就直接树状数组维护下标,二分查找答案。
1 // ——By DD_BOND 2 3 #include<bits/stdc++.h> 4 5 #define fi first 6 #define se second 7 #define pb push_back 8 #define lowbit(a) (a&(-a)) 9 10 using namespace std; 11 12 typedef long long ll; 13 typedef pair<int,int> P; 14 15 const int MAXN=1e6+10; 16 17 P a[MAXN]; 18 vector<P>q[MAXN]; 19 int b[MAXN],bit[MAXN],ans[MAXN]; 20 21 bool cmp(P x,P y){ 22 if(x.fi==y.fi) return x.se<y.se; 23 return x.fi>y.fi; 24 } 25 26 void add(int p,int n){ 27 for(int i=p;i<=n;i+=lowbit(i)) bit[i]++; 28 } 29 30 int query(int p){ 31 int sum=0; 32 for(int i=p;i>=1;i-=lowbit(i)) sum+=bit[i]; 33 return sum; 34 } 35 36 int main(void) 37 { 38 ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); 39 int n; cin>>n; 40 for(int i=1;i<=n;i++) cin>>a[i].fi,a[i].se=i,b[i]=a[i].fi; 41 int m; cin>>m; 42 for(int i=1;i<=m;i++){ 43 int k,p; cin>>k>>p; 44 q[k].pb(P(p,i)); 45 } 46 sort(a+1,a+n+1,cmp); 47 for(int i=1;i<=n;i++){ 48 add(a[i].se,n); 49 for(int j=0;j<(int)q[i].size();j++){ 50 P p=q[i][j]; 51 int l=1,r=n,res=0; 52 while(l<=r){ 53 int mid=(l+r)>>1; 54 if(query(mid)>=p.fi) res=mid,r=mid-1; 55 else l=mid+1; 56 } 57 ans[p.se]=res; 58 } 59 } 60 for(int i=1;i<=m;i++) cout<<b[ans[i]]<<endl; 61 return 0; 62 }
以上是关于Codeforces 1262D Optimal Subsequences(BIT+二分)的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces 622D Optimal Number Permutation
Codeforces 685C Optimal Point (二分不同类型距离的相互转换)
Codeforces Round #751 (Div. 2)E. Optimal Insertion(结论,分治)
Codeforces Round #751 (Div. 2)E. Optimal Insertion(结论,分治)
Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) D2. Optimal Subsequences