[CF286C] Main Sequence

Описание проблемы

Счастливое число определяются столбцы:

Пустые столбцы счастливчики серии

Если S является счастливым числом столбцов, то {R, S, -r} столбец счастливое число (г> 0)

Если Т и S являются столбцами счастливого числа, {S, T} является счастливым числом столбцов

К абсолютному значению каждого заранее определенного количества счастливого числа столбцов, и в котором некоторые из требуемого числа является отрицательным, то другой может быть положительным или отрицательным.

Q. Есть ли легальная программа, и если да, то любая данная программа. N ≤ 10 ^ 6

К счастью, число столбцов, например: {1, 2, -2, -1, 1, -1, 1, -1}

Входной сигнал: 1 111 третьего число отрицательного требование выхода: 11-1-1

ввод пробы

2
1 1
0

Пример вывода

ДА
1 -1

решение

Это может быть относительно легко увидеть это в виде последовательности скобок. Если рассматривать как положительное число, левую скобку, правую скобка рассматривается как отрицательное число, то число дало некоторое негативного Минчайн сказал, учитывая некоторые закрывающую скобку, мы должны определить, следует ли отвечать требования левой скобки. Для того, чтобы определить правую скобку, мы подметать справа снова налево, если текущая вершина стеки не равна текущему элемент или элементы обозначены как отрицательные, и будет помечена как отрицательные элементы в стеке, в противном случае вытолкнуть верхний элемент. Наконец, если стек не пуст, не свидетельствует об отсутствии решения, в противном случае выходной ответ.

код

#include <iostream>
#include <cstdio>
#define int long long
#define N 1000002
using namespace std;
int n,m,i,a[N],q[N],s[N],top;
bool f[N];
int read()
{
    char c=getchar();
    int w=0;
    while(c<'0'||c>'9') c=getchar();
    while(c<='9'&&c>='0'){
        w=w*10+c-'0';
        c=getchar();
    }
    return w;
}
signed main()
{
    n=read();
    for(i=1;i<=n;i++) a[i]=read();
    m=read();
    for(i=1;i<=m;i++){
        q[i]=read();
        f[q[i]]=1;
    }
    for(i=n;i>=1;i--){
        if(s[top]!=a[i]||f[i]) s[++top]=a[i],f[i]=1;
        else top--;
    }
    if(top){
        puts("NO");
        return 0;
    }
    puts("YES");
    for(i=1;i<=n;i++){
        if(f[i]) printf("%lld ",-a[i]);
        else printf("%lld ",a[i]);
    }
    puts("");
    return 0;
}

отражение

Если последовательность исходной последовательности рассматривается как скобки, что данное число является отрицательным числом, эквивалентно некоторому подобранных позиций закрывающей скобки. Так писать справа налево будет намного меньше, чем слева направо. Или обратить внимание интересно, если это упростить формулировку коды после того, как хороший, или же это может принести много неприятностей.

рекомендация

отwww.cnblogs.com/LSlzf/p/11745968.html