题解:P14029 【MX-X20-T3】「FAOI-R7」重排序列(update)
该做法与第一篇题解略有不同。
已知
理想情况下,对于所有
将
时间复杂度
# include <bits/stdc++.h>
using namespace std;
struct arr{
long long v;
long long new_v;
int idx;
};
arr arr1[200005];
arr arr2[200005];
bool cmp1(arr a,arr b) {return a.new_v > b.new_v;}
bool cmp2(arr a,arr b) {return a.new_v < b.new_v;}
bool cmp3(arr a,arr b) {return a.idx < b.idx;}
void solve()
{
int n,m;
scanf ("%d %d",&n,&m);
for (int i=0;i<n;i++) scanf ("%lld",&arr1[i].v);
for (int i=0;i<n;i++) scanf ("%lld",&arr2[i].v);
for (int i=0;i<n;i++)
{
arr1[i].idx = i;
arr2[i].idx = i;
arr1[i].new_v=arr1[i].v%m;
arr2[i].new_v=arr2[i].v%m;
}
sort(arr1,arr1+n,cmp1);
sort(arr2,arr2+n,cmp2);
long long ans=0;
int l=0,r=n-1;
for (int i=0;i<n;i++)
{
if (arr1[i].new_v + arr2[l].new_v >= m)
{
ans += (arr1[i].new_v + arr2[r].new_v) % m;
arr2[r--].idx = arr1[i].idx;
}
else
{
ans += (arr1[i].new_v + arr2[l].new_v) % m;
arr2[l++].idx = arr1[i].idx;
}
}
sort(arr2,arr2+n,cmp3);
printf ("%lld\n",ans);
for (int i=0;i<n;i++) printf ("%lld ",arr2[i].v);
printf ("\n");
return ;
}
int main (void)
{
int T;
scanf ("%d",&T);
while (T--)
{
solve();
}
return 0;
}