题解 饥饿的狐狸
贪心选一个最大的选一个最小的即可
Code:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 100010
#define ll long long
#define int long long
char buf[1<<21], *p1=buf, *p2=buf;
inline int read() {
int ans=0, f=1; char c=getchar();
while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
return ans*f;
}
int n, w;
int t[N];
namespace force{
int ans1=INF, ans2;
void solve() {
sort(t+1, t+n+1);
do {
int cst1=0, cst2=0, lst=w;
for (int i=1; i<=n; ++i) {
cst1+=min(llabs(t[i]-lst), llabs(t[i]-w));
cst2+=max(llabs(t[i]-lst), llabs(t[i]-w));
lst=t[i];
}
ans1=min(ans1, cst1);
ans2=max(ans2, cst2);
} while (next_permutation(t+1, t+n+1));
cout<<ans1<<' '<<ans2<<endl;
}
}
namespace task1{
int ans1, ans2;
int a[N], b[N], t1, t2, tem[N], tot;
priority_queue<ll> q;
void solve() {
int some_zero=0;
for (int i=1; i<=n; ++i) {
if (t[i]>w) a[++t1]=t[i];
else if (t[i]<w) b[++t2]=t[i];
else some_zero+=1;
}
sort(a+1, a+t1+1, [](int a, int b){return a>b;}); sort(b+1, b+t2+1);
if (t1) ans1+=a[1]-w;
if (t2) ans1+=w-b[1];
// cout<<"ans1: "<<ans1<<endl;
int c=min(t1, t2);
// for (int i=c+1; i<=t1; ++i) ans2+=llabs(a[i]-w);
// for (int i=c+1; i<=t2; ++i) ans2+=llabs(b[i]-w);
for (int i=1; i<=c; ++i) ans2+=2*(llabs(a[i]-w)+llabs(b[i]-w));
if (t1==t2 && !some_zero) {
int minn=INF;
for (int i=1; i<=c; ++i) {
minn=min(minn, llabs(a[i]-w));
minn=min(minn, llabs(b[i]-w));
}
ans2-=minn;
}
for (int i=c+1; i<=t1; ++i) q.push(llabs(a[i]-w));
for (int i=c+1; i<=t2; ++i) q.push(llabs(b[i]-w));
if (some_zero) while (q.size() && some_zero) {ans2+=2*q.top(); q.pop(); --some_zero;}
// while (q.size()) {ans2+=q.top(); q.pop();}
while (q.size()) {tem[++tot]=q.top(); q.pop();}
int pos1=1, pos2=tot;
while (pos1<=pos2) {
if (pos1==pos2) {ans2+=tem[pos1]; break;}
else {
ans2+=tem[pos1];
ans2+=max(llabs(tem[pos1]-tem[pos2]), tem[pos2]);
++pos1; --pos2;
}
}
// cout<<"ans2: "<<ans2<<endl;
printf("%lld %lld\n", ans1, ans2);
exit(0);
}
}
signed main()
{
freopen("a.in", "r", stdin);
freopen("a.out", "w", stdout);
n=read(); w=read();
for (int i=1; i<=n; ++i) t[i]=read();
// force::solve();
task1::solve();
return 0;
}