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;
        }
    } 
  • 相关阅读:
    程序员学习能力提升三要素(转)
    网页游戏框架
    CS心得
    项目主管谈网页游戏:一将功成万骨枯
    分享成为高效程序员的7个重要习惯
    看代码的实质
    点击delphi中wwDBGrid标题进行排序
    DataRow 学习
    学习遇到的问题MVC设置 起始页后怎样恢复
    泛型中的where
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10749071.html
Copyright © 2011-2022 走看看