HDU 1394 Minimum Inversion Number(树状数组求逆序数对)

 

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394

        题意是求0到n-1的逆序数对的个数,每次求完一次可以把第一个值放在最后一个位置,问最小的逆序数对的个数是多少。

        我们可以求出第一种逆序数对 然后通过公式推出其他的逆序数对的个数,至于求的过程当模板看吧...


AC代码:

#include <bits/stdc++.h>
#define maxn 5005
using namespace std;
int n,pre[maxn];
map<int,int> ma;

int lowbit(int x){return x & (-x);}

void Update(int x){
  for(int i=x;i<=n;i+=lowbit(i)){
    ma[i] ++;
  }
}

int Query(int x){
  int ans = 0;
  for(int i=x;i>=1;i-=lowbit(i)){
    ans += ma[i];
  }
  return ans;
}

int main()
{
  while(~scanf("%d",&n)){
    ma.clear();
    memset(pre,0,sizeof(pre));
    for(int i=1;i<=n;i++){
      scanf("%d",&pre[i]);
      pre[i]++;
    }
    int ans = 0;
    for(int i=1;i<=n;i++){
      Update(pre[i]);
      ans += i - Query(pre[i]);
    }
    int num = 0x3f3f3f3f;
    for(int i=1;i<=n;i++){
      ans = ans + n - (pre[i] - 1) - 1 - (pre[i] - 1);
      if(num > ans) num = ans;
    }
    printf("%d\n",num);
  }
  return 0;
}

 

全部评论

相关推荐

牛客41406533...:回答他在课上学,一辈子待在学校的老教授用三十年前的祖传PPT一字一句的讲解,使用谭浩强红皮书作为教材在devc++里面敲出a+++++a的瞬间爆出114514个编译错误来学这样才显得专业
点赞 评论 收藏
分享
kabuu:问多了怕遇到聪明人坑不了了,说不定里面很坑呢,还是相信自己的选择吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务