只是做个笔记
本题可用树状数组做
题目描述
给一个数组,算inverted pair的数目
输入
有多组测试样例。每组输入数据占一行,每一行是一个数组,数组之间的元素用空格分开
输出
每组输出结果占一行。对应于每组输入数据的inversions
样例输入 Copy
1 2 3
2 1 3
3 2 1
样例输出 Copy
0
1
3
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000000;
#define lowbit(i) ((i)&(-i))
struct node {
int val;
int pos;
}temp[MAXN];
int c[MAXN],A[MAXN],ans;
bool cmp(node a,node b){
return a.val<b.val;
}
void update(int x,int v){
for(int i=x;i<=ans;i+=lowbit(i)){
c[i]+=v;
}
}
int get_sum(int x){
int sum=0;
for(int i=x;i>0;i-=lowbit(i)){
sum+=c[i];
}
return sum;
}
int main(){
string str;
while(getline(cin,str)){
memset(c,0,sizeof(c));
int l=str.size();
ans=0;
for(int i=0;i<l;i++){
if(str[i]!=' '){
temp[ans].val=str[i]-'0';
temp[ans].pos=ans+1;
ans++;
}
}
sort(temp,temp+ans,cmp);
A[temp[0].pos]=1;
for(int i=1;i<ans;i++){
if(temp[i].val!=temp[i-1].val){
A[temp[i].pos]=i+1;
}
else {
A[temp[i].pos]=A[temp[i-1].pos];
}
}
int sum=0;
for(int i=1;i<=ans;i++){
update(A[i],1);
sum+=get_sum(ans)-get_sum(A[i]);
}
printf("%d\n",sum);
}
return 0;
}