?
# | Author | Problem | Lang | Verdict | Time | Memory | Sent | Judged | |
---|---|---|---|---|---|---|---|---|---|
60002491 |
Contestant: Apollochen |
1214F - 59 | GNU C++11 | Accepted | 171 ms | 4708 KB | 2019-09-04 13:19:22 | 2019-09-04 15:04:39 |
#include <bits/stdc++.h> using namespace std; typedef long long ll ; const int N = 200005; int n,m,p[N]; struct node { int x,idx; bool operator < (const node &a) const {return x<a.x;} }a[N],b[N]; ll check(int x) { ll ret=0; if(x<0) { for(int i=1;i<=-x;i++)ret+=b[i].x+m-a[n+x+i].x; for(int i=-x+1;i<=n;i++)ret+=abs(b[i].x-a[i+x].x); }else { for(int i=1;i<=x;i++)ret+=a[i].x+m-b[n-x+i].x; for(int i=x+1;i<=n;i++)ret+=abs(a[i].x-b[i-x].x); }return ret; } void print(int x) { if(x<0) { for(int i=1;i<=-x;i++)p[b[i].idx]=a[n+x+i].idx; //ret+=b[i].x+m-a[n-i+1].x; for(int i=-x+1;i<=n;i++)p[b[i].idx]=a[i+x].idx; //ret+=abs(b[i].x-a[i+x].x); // return ret; }else { for(int i=1;i<=x;i++)p[b[n-x+i].idx]=a[i].idx; //ret+=a[i].x+m-b[n-i+1].x; for(int i=x+1;i<=n;i++)p[b[i-x].idx]=a[i].idx; //ret+=abs(a[i].x-a[i-x].x); // return ret; } } int q[N]; int main() { scanf("%d%d",&m,&n); for(int i=1;i<=n;i++)scanf("%d",&a[i].x),a[i].idx=i;sort(a+1,a+n+1); for(int i=1;i<=n;i++)scanf("%d",&b[i].x),b[i].idx=i;sort(b+1,b+n+1); int l=-n,r=n; while(l<r) { int m=(l+r)>>1; if(check(m)<check(m+1))r=m;else l=m+1; } printf("%lld\n",check(l));print(l); for(int i=1;i<=n;i++)q[p[i]]=i; for(int i=1;i<=n;i++)printf("%d ",q[i]); }
?
?
?
?