hdu1394-Minimum Inversion Number [Data Structure] [Fenwick tree] - C ++

Gives a permutation 0 ~ n-1 can be moved integrally, seeking to reverse the minimum

The numbers added num [i] is equivalent to tree-like array of n-num [i] plus 1 bit

Because the num [i] is the first (n-1) -num [i] + 1 = n-num [i] large number, generating reverse order, only the numbers may have been inserted prior to, this time interval query directly i.e. can

 

 1 #include <set>
 2 #include <map>
 3 #include <cmath>
 4 #include <queue>
 5 #include <vector>
 6 #include <cstdio>
 7 #include <cstdlib>
 8 #include <cstring>
 9 #include <iostream>
10 #include <algorithm>
11 using namespace std;
12 const int MAXN=5001;
13 int a[MAXN],n,t=1,T;
14 int lb(int i){return i&-i;}
15 void init(){memset(a,0,sizeof(a));}
16 void add(int i,int v){for(;i<=n;a[i]+=v,i+=lb(i));}
17 int sum(int i){int ans=0;for(;i;ans+=a[i],i-=lb(i));return ans;}
18 int query(int i,int j){return sum(j)-sum(i-1);}
19 
20 int num[MAXN],cnt,ans;
21 int main() {
22     while(scanf("%d",&n)!=EOF){
23         init(),cnt=0;
24         for(int i=1;i<=n;i++)scanf("%d",&num[i]);
25         for(int i=1;i<=n;i++)cnt+=query(1,n-num[i]-1),add(n-num[i],1);
26         ans=cnt;
27         for(int i=1;i<n;i++){
28             add(n-num[i],-1);
29             cnt+=query(1,n-num[i]-1)-num[i];
30             add(n-num[i],1);
31             ans=min(ans,cnt);
32         }
33         cout<<ans<<endl;
34     }
35     return 0;
36 }

 

Guess you like

Origin www.cnblogs.com/JasonCow/p/12289625.html