• 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 }
  • 相关阅读:
    Linux编程之UDP SOCKET全攻略
    Java8 flatMap的sample
    swagger bug
    bash中的pasue
    树、二叉树、满二叉树、完全二叉树概念分清
    复习一下高中数学
    SpringBoot Junit Maven JaCoCo
    事务传播和隔离
    springboot swagger2 泛型踩坑记
    Code::Blocks debug程序
  • 原文地址:https://www.cnblogs.com/dd-bond/p/11934496.html
Copyright © 2020-2023  润新知