思路:
贪心,排一遍序,预处理处后缀max和前缀max,然后每次丢掉一个领带做就行
c o d e code code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n;
int b[1001000], c[1001000], d[1001000], p[1001000], t[1001000], ans[1001000];
struct node
{
int id, x;
}a[1001000];
bool cmp(node x, node y)
{
return x.x<y.x;
}
int main()
{
scanf("%d", &n);
for(int i=1; i<=n+1; i++)
scanf("%d", &a[i].x), a[i].id=i;
sort(a+1, a+2+n, cmp);
for(int i=1; i<=n; i++)
scanf("%d", &b[i]);
sort(b+1, b+1+n);
for(int i=1; i<=n; i++)
{
c[i]=max(0, a[i].x-b[i]);
d[i]=max(0, a[i+1].x-b[i]);
}
for(int i=1; i<=n+1; i++)
p[i]=max(p[i-1], c[i]);
for(int i=n+1; i>=1; i--)
t[i]=max(t[i+1], d[i]);
for(int i=1; i<=n+1; i++)
ans[a[i].id]=max(p[i], t[i]);
for(int i=1; i<=n+1; i++)
printf("%d ", ans[i]);
return 0;
}