Cod sursa(job #1293892)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 16 decembrie 2014 18:36:47
Problema Matrice 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define ll long long
#define len(x) x&(-x)
using namespace std;
ifstream f("pikachu.in");
ofstream g("pikachu.out");
 int n,k,v[100005],eq[100005],ord[100005];
  ll aib1[100005],aib2[100005],sum;
 ll sol=(1LL<<61);
 bool comp(int x,int y)
 { return v[x]<v[y]; }

 void Update(ll aib[],int x,int val)
 { int i;
    for(i=x;i<=n;i+=len(i))
     aib[i]+=val;
 }

 ll Query(ll aib[],int x)
 { int i; ll res=0;

   for(i=x;i>0;i-=len(i))
     res=(ll) res+aib[i];

   return 1LL*res;
 }

 int SearchMed()
 { int st=1,dr=n,mid,r1,r2,num=(k+1)/2;

     while(st<=dr)
     { mid=(st+dr)/2;
       r1=Query(aib1,mid);
       if (r1>=num) dr=mid-1;
        else st=mid+1;
     }

    mid=(st+dr)/2;
   r1=Query(aib1,mid-1);
    if (r1<num) mid++;

    return mid;
 }
int main()
{ int i,med;
  ll res,res1,res2;

  f>>n>>k;

  for(i=1;i<=n;i++)
   {f>>v[i];

    ord[i]=i;
   }

  sort(ord+1,ord+n+1,comp);

   for(i=1;i<=n;i++)
    { eq[i]=v[ord[i]];
      v[ord[i]]=i;
    }

   for(i=1;i<=n;i++)
   {
     Update(aib1,v[i],1);
     Update(aib2,v[i],eq[v[i]]);
     if (i>k)
     { Update(aib1,v[i-k],-1);
       Update(aib2,v[i-k],-eq[v[i-k]]);
     }

     if (i>=k)
     {med=SearchMed();

        sum=(ll)Query(aib2,med);
        res1=(ll)eq[med]*((k+1)/2)-sum;

        res2=(ll) Query(aib2,n)- sum - 1LL*eq[med]*(k-((k+1)/2));

        res1+=res2;
          //cout<<res1<<"\n";

      if ((ll)res1<(ll)sol) sol=(ll)res1;

     }
   }

 g<<sol;
    return 0;
}