[CF351E]Jeff and Permutation——貪心
阿新 • • 發佈:2018-12-23
題目大意:
給出陣列a ,你可以改變每個數的正負,求逆序對數最少是多少
思路:
考慮一個數對\((a_i,a_j)\)的貢獻之和絕對值大的那個數字有關。
於是我們把每個數對的計算放在絕對值較大的那個數上面,不難發現這個位置產生的逆序對只和它自己本身的正負有關,直接BIT貪心就好了。
#include<bits/stdc++.h> #define REP(i,a,b) for(int i=a,i##_end_=b;i<=i##_end_;++i) #define DREP(i,a,b) for(int i=a,i##_end_=b;i>=i##_end_;--i) #define debug(x) cout<<#x<<"="<<x<<endl #define fi first #define se second #define mk make_pair #define pb push_back typedef long long ll; using namespace std; void File(){ freopen("inverse.in","r",stdin); freopen("inverse.out","w",stdout); } template<typename T>void read(T &_){ _=0; T f=1; char c=getchar(); for(;!isdigit(c);c=getchar())if(c=='-')f=-1; for(;isdigit(c);c=getchar())_=(_<<1)+(_<<3)+(c^'0'); _*=f; } const int maxn=1e6+10; const int N=1e6; int n,a[maxn]; ll ans; struct BIT{ int sum[maxn]; int lowbit(int x){return x&(-x);} void add(int p,int x){for(;p<=N;p+=lowbit(p))sum[p]+=x;} int query(int p){int ret=0;for(;p>=1;p-=lowbit(p))ret+=sum[p];return ret;} }T1,T2; int main(){ File(); read(n); REP(i,1,n)read(a[i]),a[i]=abs(a[i])+1; REP(i,1,n)T1.add(a[i],1); REP(i,1,n){ ans+=min(T1.query(a[i]-1),T2.query(a[i]-1)); T1.add(a[i],-1); T2.add(a[i],1); //printf("%d\n",T1.query(N)+T2.query(N)); } printf("%lld\n",ans); return 0; }