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
  • 相关阅读:
    AMBA总线介绍
    placeholder不显示的解决办法(支持ie8以上)
    通过新浪微博API获取数据
    PHP时间运算
    PHP队列
    stream_context_create()
    http_build_query()
    shuffle()
    session_id()
    session_name()
  • 原文地址:https://www.cnblogs.com/jihe/p/5563988.html
Copyright © 2011-2022 走看看