Problem Description
bobo has a sequence a1,a2,…,an. He is allowed to swap two adjacent numbers for no more than k times.
Find the minimum number of inversions after his swaps.
Note: The number of inversions is the number of pair (i,j) where 1≤i<j≤n and ai>aj.
Input
The input consists of several tests. For each tests:
The first line contains 2 integers n,k (1≤n≤105,0≤k≤109). The second line contains n integers a1,a2,…,an (0≤ai≤109).
Output
For each tests:
A single integer denotes the minimum number of inversions.
Sample Input
3 1
2 2 1
3 0
2 2 1
Sample Output
1
2
思路:离散化+树状数组 |
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,n) for (int i=a;i<n;i++)
#define repe(i,a,n) for (int i=a;i<=n;i++)
typedef long long LL;
typedef pair<int,int> PII;
const int MAXN = 1e5 + 50;
int n,k;
PII v[MAXN];
class BIT{
public:
void Init(int n){
this->n = n;
mem(c,0);
}
void update(int x,int y){
while(x<=n){
c[x] += y;
x += lowbit(x);
}
}
LL query(int x){
LL res = 0;
while (x>0){
res += c[x];
x -= lowbit(x);
}
return res;
}
private:
int n,c[MAXN];
inline int lowbit(int x){return x&(-x);}
};
BIT bit;
int main(){
while(cin>>n>>k){
for(int i = 1;i <= n;i++){
cin>>v[i].first;
v[i].second = i; //离散化
}
bit.Init(n);
sort(v+1,v+n+1,[](const PII& lhs,const PII& rhs){
if(lhs.first==rhs.first){
return lhs.second<rhs.second;
}
else return lhs.first<rhs.first;
});
LL res = 0;
repe(i,1,n){
bit.update(v[i].second,1);
res += i - bit.query(v[i].second);
}
cout<<max(res - k,0LL)<<endl;
}
return 0;
}