hdu4911 Inversion
Posted 罚时自动机
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于hdu4911 Inversion的主要内容,如果未能解决你的问题,请参考以下文章