设为首页 加入收藏

TOP

hdu 1394(BIT求逆序数)
2015-11-21 00:55:26 来源: 作者: 【 】 浏览:1
Tags:hdu 1394 BIT 序数

题意:有长度为n的序列,序列的数字是0~n-1组成,然后这个序列可以看做环,那么就有n个长度为n的序列,问n个序列里最小逆序数是多少。
题解:先把初始序列的逆序数算出来,然后移动每一个开头数字a到后面,逆序数变化的是比a大的数字逆序数加一,比a小的逆序数减一,所以按这个规律再循环一次找最小值就可以了。

#include 
   
     #include 
    
      #include 
     
       using namespace std; const int N = 5005; int n, C[N], a[N]; int lowbit(int x) { return x & (-x); } int Sum(int x) { int ret = 0; while (x > 0) { ret += C[x]; x -= lowbit(x); } return ret; } void Add(int x, int d) { while (x <= n) { C[x] += d; x += lowbit(x); } } int main() { while (scanf(%d, &n) == 1) { memset(C, 0, sizeof(C)); int sum = 0; for (int i = 1; i <= n; i++) { scanf(%d, &a[i]); Add(a[i] + 1, 1); sum += i - Sum(a[i] + 1); } int res = sum; for (int i = 1; i < n; i++) { sum = sum + ((n - 1 - a[i]) - a[i]); res = min(res, sum); } printf(%d , res); } return 0; }
     
    
   

?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU - 1827 Summer Holiday(强连.. 下一篇HDU - 3836 Equivalent Sets (强..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: