HDU 5775 Bubble Sort 树状数组

来源:互联网 发布:在淘宝买狗狗安全吗 编辑:程序博客网 时间:2024/06/05 03:54

题目链接

题意: 1 - N 的一个排列 进行冒泡排序 输出排序时i出现的最左位置和最右位置的差,i 为 1 - N

第K个数 出现的三个边界情况为
1.位置K
2.最右位置为 K + (K 右边比第K个数小的数的个数)
3.位置(第k个数的值)

最后取差最大的

代码:

#include <cstdio>#include <iostream>#include <cstring>#include <queue>#include <algorithm>#include <map>#include <cmath>#define sf scanf#define pf printfusing namespace std;const int maxn = 100000 + 10;int num[maxn];int ans[maxn];int FABS(int n){    return n > 0 ? n : -n;}struct BIT{    int C[maxn];    int n;    void init(int _n){        n = _n;        for(int i = 0;i <= n;++i){            C[i] = 0;        }    }    int lowbit(int x){        return x & ( -x );    }    void add(int x,int d){        while(x <= n){            C[x] += d;            x += lowbit(x);        }    }    int sum(int x){        int ret = 0;        while( x > 0 ){            ret += C[x];            x -= lowbit(x);        }        return ret;    }}tree;int main(){    int T,ca = 0;    sf("%d",&T);    while( T-- ){        int n;sf("%d",&n);        tree.init(n);        for(int i = 1;i <= n;++i){            sf("%d",&num[i]);            ans[i] = 0;        }        for(int i = n;i > 0;--i){            int low_cnt = tree.sum(num[i]);            int low_pos = i + low_cnt;            ans[num[i]] = max(FABS(num[i] - i) , max(FABS(num[i] - low_pos),FABS(i - low_pos)));            tree.add(num[i],1);        }        pf("Case #%d:",++ca);        for(int i = 1;i <= n;++i) pf(" %d",ans[i]);        pf("\n");    }    return 0;}
0 0