UOJ#152盘子序列

题面君

那这是一题比较标准的单调栈的题目,维护一下单调栈并访问就好了

 1 int n;//因为我写了十几行头文件。。头文件就删了,大家自己加一下吧。。
 2 int a[100005];
 3 int s1[100005],s2[100005],t1,t2;
 4 
 5 int get(){//快读
 6     int x=0,f=1;
 7     char ch=getchar();
 8     while(ch<'0'||ch>'9'){
 9         if(ch=='-')f=-1;
10         ch=getchar();
11     }
12     while(ch>='0'&&ch<='9'){
13         x=x*10+ch-'0';
14         ch=getchar();
15     }
16     return x*f;
17 }
18 
19 int main(){
20     while(scanf("%d",&n)!=EOF){//停止条件
21         t1=t2=0;
22         for(int i=1;i<=n;i++){
23             a[n-i+1]=get();//倒着读入
24         }
25         for(int i=1;i<=n;i++){
26             while(t2&&s2[t2]>a[i]){//维护单调性
27                 s1[++t1]=s2[t2--];
28             }
29             if(!s2[t2]||a[i]>s2[t2]){
30                 s2[++t2]=a[i];
31             }
32         }
33         bool ok=true;
34         while(t2)s1[++t1]=s2[t2--];
35         for(int i=1;i<t1;i++){
36             if(s1[i]<s1[i+1]){//若危险输出J
37                 printf("J
");
38                 ok=false;
39                 break;
40             }
41         }
42         if(ok){
43             printf("Y
");//反之输出Y
44         }
45     }
46     return 0;
47 }

嗯白白

原文地址:https://www.cnblogs.com/hahaha2124652975/p/11193630.html