c题题解,将x化为pk+b的形式。按照k进行分组,然后用map统计每组的数量。然后根据k的移动,确定index的最后三次排序得出结果
#include<bits/stdc++.h>
using namespace std;
#define ll long long
map<ll,ll> num;
ll ss[10000100];
int main()
{
ll n,k,p;
ll maxs=-9223372036854775808;
scanf("%lld%lld%lld",&n,&k,&p);
for(ll i=0;i<n;i++)
{
ll x,s;
scanf("%lld",&x);
ss[i]=x;
if(p!=0)
s=x/p;//把x化为ps+b处理
maxs=max(s,maxs);
num[s]++;
}
if(p==0)
{
sort(ss,ss+n);
for(ll i=0;i<n;i++)
{
printf("%lld",ss[i]);
if(i==n-1)
printf("\n");
else
printf(" ");
}
return 0;
}
ll index=maxs;
ll last=0;
while(1)
{
if(k>num[index])
{
k=k-num[index];
num[index-1]+=num[index];
last=num[index];
num.erase(index);
index--;//
}
else
break;
}
sort(ss,ss+n);
ll fir=lower_bound(ss, ss+n, index*p)-ss;
fir=fir+num[index]-k-1;
for(ll i=n-last;i<n;i++)
{
ss[i]=ss[i]%p+(index)*p;
}
sort(ss,ss+n);
for(ll i=n-1;i>=n-k;i--)
{
ss[i]-=p;
}
sort(ss,ss+n);
for(ll i=0;i<n;i++)
{
printf("%lld",ss[i]);
if(i==n-1)
printf("\n");
else
printf(" ");
}
return 0;
}
京公网安备 11010502036488号