Loading

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("");
}

posted @ 2021-06-29 09:49  yoisaki_hizeci  阅读(42)  评论(0)    收藏  举报