hdu1394

时间:2023-03-09 14:31:17
hdu1394
 //Accepted    292 KB    46 ms
 //利用线段树求逆序数
 //对于每个数看前面比他大的数有多少个,更新这个数的个数
 #include <cstdio>
 #include <cstring>
 #include <iostream>
 #include <queue>
 #include <cmath>
 #include <algorithm>
 using namespace std;
 /**
   * This is a documentation comment block
   * 如果有一天你坚持不下去了,就想想你为什么走到这儿!
   * @authr songt
   */
 ;
 struct node
 {
     int l,r;
     int sum;
 }f[*imax_n];
 int a[imax_n];
 int n;
 void build(int t,int l,int r)
 {
     f[t].l=l;
     f[t].r=r;
     f[t].sum=;
     if (l==r)
     {
         return ;
     }
     ;
     build(*t,l,mid);
     build(*t+,mid+,r);
 }
 void update(int t,int l)
 {
     if (f[t].l==l && f[t].r==l)
     {
         f[t].sum++;
         return ;
     }
     ;
     *t,l);
     *t+,l);
     f[t].sum=f[*t].sum+f[*t+].sum;
 }
 int query(int t,int l,int r)
 {
     if (f[t].l==l && f[t].r==r)
     {
         return f[t].sum;
     }
     ;
     *t,l,r);
     else
     {
         *t+,l,r);
         *t,l,mid)+query(*t+,mid+,r);
     }
 }
 void slove()
 {
     build(,,n);
     ;
     int ans;
     ;i<n;i++)
     {
         update(,a[i]);
         if (a[i]==n) continue;
         ,a[i]+,n);
         sum+=t;
         //printf("%d ",t);
     }
     //printf("\n");
     //printf("%d\n",sum);
     ans=sum;
     ;i<n;i++)
     {
         sum=sum+(n-a[i])-(a[i]-);
         if (sum<ans) ans=sum;
     }
     printf("%d\n",ans);
 }
 int main()
 {
     while (scanf("%d",&n)!=EOF)
     {
         ;i<n;i++)
         {
             scanf("%d",&a[i]);
             a[i]++;
         }
         slove();
     }
     ;
 }