Pagini recente » Cod sursa (job #2016337) | Cod sursa (job #2431489) | Cod sursa (job #2877386) | Monitorul de evaluare | Cod sursa (job #1293892)
#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;
}