zoukankan      html  css  js  c++  java
  • hdu5592 倒序求排列+权值线段树

    这种题为什么要用到主席树啊、、8说了,直接上代码

    /*
    1-n的排列,给定所有前缀的逆序对数量,要求恢复排列 
    首先能确定最后一个数是什么,然后倒序确定即可 
    开线段树找空位:如果Ai-Ai-1=k,说明pi前面有k个数比它要大,,即有i-k-1个数比它小,
    那么pi排在第i-k位,线段树查询第i-k个空位,然后把这个空位填上即可 
    */
    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 50005
    int n,a[maxn],ans[maxn];
    
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    int sum[maxn<<2];
    void build(int l,int r,int rt){
        if(l==r){sum[rt]=1;return;}
        int m=l+r>>1;
        build(lson);build(rson);
        sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    }
    void update(int l,int r,int rt,int pos){
        if(l==r){sum[rt]--;return;}
        int m=l+r>>1;
        if(pos<=m)update(lson,pos);
        else update(rson,pos);
        sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    }
    int query(int l,int r,int rt,int k){
        if(l==r)return l;
        int m=l+r>>1;
        if(k<=sum[rt<<1])return query(lson,k);
        else return query(rson,k-sum[rt<<1]);
    }
    
    int main(){
        int T;
        cin>>T;    
        while(T--){
            cin>>n;
            for(int i=1;i<=n;i++)cin>>a[i];
            build(1,n,1);
            for(int i=n;i>=1;i--){
                int k=a[i]-a[i-1];
                ans[i]=query(1,n,1,i-k);
                update(1,n,1,ans[i]);
            } 
            for(int i=1;i<n;i++)cout<<ans[i]<<" ";
            cout<<ans[n]<<endl;
        }
    } 
  • 相关阅读:
    hlgoj 1766 Cubing
    Reverse Linked List
    String to Integer
    Bitwise AND of Numbers Range
    Best Time to Buy and Sell Stock III
    First Missing Positive
    Permutation Sequence
    Next Permutation
    Gray Code
    Number of Islands
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10749071.html
Copyright © 2011-2022 走看看