zoukankan      html  css  js  c++  java
  • hdu4911 Inversion

    题意:给一个序列,n个数,可以进行k次操作,每次可以交换相邻的两个数,问最多k次操作后最少剩余多少个逆序对

    分析:如果序列中存在逆序对,那么每次操作,只会影响相邻的两个数,也就是说每次操作最多减少1个逆序对,那么只要求出原来序列的逆序对ans

    输出max(ans-k,0)

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int maxn=1e5+5;
    long long ans;
    int d[maxn],p[maxn];
    
    void merge_sort(int *A,int x,int y,int *T){
        if(y-x>1){
            int m=x+(y-x)/2;
            int p=x,q=m,i=x;
            merge_sort(A,x,m,T);
            merge_sort(A,m,y,T);
            while(p<m||q<y){
                if(q>=y||(p<m&&A[p]<=A[q]))
                  T[i++]=A[p++];
                else{
                  T[i++]=A[q++];
                  ans+=m-p;
                }
            }
            for(i=x;i<y;i++)
              A[i]=T[i];
        }
    }
    
    int main(){
        int n,k;
        while(cin>>n>>k){
            for(int i=0;i<n;i++)
              scanf("%d",d+i);
            ans=0;
            merge_sort(d,0,n,p);
            ans-=k;
            if(ans<0)ans=0;
            cout<<ans<<endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    js-21点小游戏
    js-打印出现最多次的字母
    盒模型浮动
    九九乘法表
    猫眼-湄公河行动电影介绍页面
    (day4)用css画三角形以及红旗
    cookie的使用
    用Servlet校验密码2
    Servlet登录验证
    Servlet概述
  • 原文地址:https://www.cnblogs.com/jihe/p/5563988.html
Copyright © 2011-2022 走看看