CF1039A题解
首先可以发现一定有一个合法的排列为\(p_i=i\),因此如果对于某个\(i\)出现了\(x_i<i\),显然此时一定无解。此外还可以得出\(b_i\ge a_i+t\)。
考虑\(x_i=c\)代表什么,这意味着存在一个排列\(p\),其中第\(i\)辆公交车的出现时刻为\(b_c\),而此时\(i+1\sim c\)的公交车会去哪里?那么此时有一种贪心的构造方式:
\[i\to c,i+1\to i,i+2\to i-1,\cdots,c\to c-1
\]
显然这已经是最优的了。
因此考虑初始化\(b_i=a_i+t\)。
然后扫一遍记录当前\(mx=\max\{a_i \}\),若\(mx>i\),则要\(b_i=b_{i+1}\)并且将\(b_{i+1}\)加\(1\)。
最后再判断一下每个数能否到达对应的\(x_i\)即可。
inline void evil(){puts("No");exit(0);}
int n,t;
int a[222222],x[222222];
int b[222222];
signed main()
{
n=read(),t=read();
R(i,1,n) a[i]=read();
R(i,1,n)
{
x[i]=read();
if(x[i]<i) evil();
}
R(i,1,n) b[i]=a[i]+t;
int mx=0;
R(i,1,n)
{
mx=max(mx,x[i]);
if(mx>i) b[i]=b[i+1],++b[i+1];
}
for(int L=1,R=1;L<=n;L++)
{
if(R<=L) R=L+1;
while(R<=n&&a[R]+t<=b[R-1]) ++R;
if(x[L]!=R-1) evil();
}
puts("Yes");
R(i,1,n) printf("%lld ",b[i]); puts("");
}

浙公网安备 33010602011771号