那这是一题比较标准的单调栈的题目,维护一下单调栈并访问就好了
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 }
嗯白白