[cf286C]Main Sequence

从右往左遍历,维护一个栈存未匹配的负数,如果一个位置一定是负数就放进栈里,如果是正数并且可以匹配,显然可以贪心匹配,否则就当作负数再加入栈中,最终看栈是否空了

 1 #include
 2 using namespace std;
 3 stack<int>st;
 4 int n,m,x,a[1000005];
 5 int main(){
 6     scanf("%d",&n);
 7     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
 8     scanf("%d",&m);
 9     for(int i=1;i<=m;i++){
10         scanf("%d",&x);
11         a[x]*=-1;
12     }
13     for(int i=n;i;i--)
14         if ((a[i]>=0)&&(!st.empty())&&(st.top()+a[i]==0))st.pop();
15         else st.push(a[i]=-abs(a[i]));
16     if (!st.empty()){
17         printf("NO");
18         return 0;
19     }
20     printf("YES\n");
21     for(int i=1;i<=n;i++)printf("%d ",a[i]);
22 } 
View Code

 

你可能感兴趣的:([cf286C]Main Sequence)