問題の説明
ラッキーナンバーは、定義された列です。
空の列はラッキーシリーズです
Sがラッキー数字列である場合には、{R、S、-r}列がラッキーナンバー(R> 0)であります
T及びSはラッキー番号列である場合、{S、T}は列の数であるラッキー
それぞれの絶対値ラッキー列の数、及び前記必要な数の一部が負の所定数に、他方が正または負であってもよいです。
Q.正当なプログラムがあり、そうであれば、任意のプログラム。N≤10 ^ 6
幸いなことに、列の例の数:{1、2、-2、-1、1、-1、1、-1}
入力:11-1-1:1111第3の数は負の出力クレーム
サンプル入力
2
1
0
サンプル出力
YES
1 -1
解決
括弧のシーケンスの形である見ることが比較的簡単にすることができます。括弧を左に正の数、負の数として見右括弧と見た場合、負Minchinが言ったのいくつかを与えられた番号は、閉じ括弧のいくつかを考えると、我々は左括弧の要件を満たしているかどうかを判断する必要があります。右括弧を定義するために、スタックの現在のトップが現在の要素または要素に等しくない場合、我々は、再び右から左へ掃引を負として指定され、スタック内の負の要素としてラベル付けされ、そうでない場合はトップエレメントをポップ。最後に、スタックは、解がないことを示す、空でない場合、そうでない場合、出力応答。
コード
#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;
}
反射
所定の数であるブラケットと見なさ元の配列の配列が、負の数であればいくつかの厳選位置閉じ括弧に相当します。だから、左から右に比べてはるかに少ないだろう右から左に書きます。それとも、それは良いの後に、コードの文言を簡素化するために、またはそうでなければ、トラブルの多くをもたらすことがある場合は疑問に注意を払います。