乾坤大挪移

来源:互联网 发布:手机免流量软件 编辑:程序博客网 时间:2024/04/26 22:32

乾坤大挪移

  •             时间限制: 1000 ms 内存限制: 65535 K                 
  • 问题描述
  •                 给定一个n,代表有1~n个数,然后给定这n个数的一个序列,可以进行的操作是不断交换相邻的两个数字,使得最后的结果是一个上升序列。例如1 3 2,交换2和3,就能得到1 2 3,即为所求的序列,此时只交换了一步,所以输出1.           
  • 输入
  •                 有多组输入,每组输入分两行,第一行是一个整数n,代表共n个数字(2<= n <= 1200),第二行为1~n这n个数字的一个随机排列。           
  • 输出
  •                 对于每组数据,输出其所需要移动的步数。           
  • 样例输入
  • 31 3 241 2 3 4
  • 样例输出
  • 10

     
    解题:逆序数+数状数组
     

    #include<cstdio>#include<cmath>#include<cstring>using namespace std;#define MAXN 2000int c[MAXN];int lowbit(int x){return x&(-x);}void update(int x){while(x<MAXN){c[x]++;x+=lowbit(x);}}int sum(int x){int s=0;while(x>0){s+=c[x];x-=lowbit(x);}return s;}int main(){int n;int i,s,a;while(scanf("%d",&n)==1){s=0;memset(c,0,sizeof(c));for(i=1;i<=n;i++){scanf("%d",&a);s+=(a-sum(a)-1);update(a);}printf("%d\n",s);}return 0;}