Codeforces

Luogu

分析

首先这个东西可以让人想到括号匹配。我们把正数看成 (,负数看成 )

因为有些数强制为 ),因此我们从右往左扫,如果碰到一个强制为 ) 的数就丢到栈中,否则能匹配就匹配。

正确性比较显然。

代码

// ===================================
//   author: M_sea
//   website: http://m-sea-blog.com/
// ===================================
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define re register
using namespace std;

inline int read() {
    int X=0,w=1; char c=getchar();
    while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
    while (c>='0'&&c<='9') X=X*10+c-'0',c=getchar();
    return X*w;
}

const int N=1000000+10;

int n,m;
int a[N],mark[N];
int sta[N],top=0,ans[N];

int main() {
    n=read();
    for (re int i=1;i<=n;++i) a[i]=read();
    m=read();
    for (re int i=1;i<=m;++i) mark[read()]=i;
    for (re int i=n;i;--i) {
        if (mark[i]) sta[++top]=a[i],ans[i]=-a[i];
        else {
            if (top&&sta[top]==a[i]) --top,ans[i]=a[i];
            else sta[++top]=a[i],ans[i]=-a[i];
        }
    }
    if (top) puts("NO");
    else {
        puts("YES");
        for (re int i=1;i<=n;++i) printf("%d ",ans[i]); puts("");
    }
    return 0;
}
最后修改:2019 年 10 月 25 日 05 : 30 PM