0pts,找规律求助(请不要在此发布暴力枚举)

P4387 【深基15.习9】验证栈序列

milai @ 2024-09-25 20:36:43

CODE

#include<bits/stdc++.h>
using namespace std;
int input,output,a[114514],b[114514];
int main(){
    int T,n;
    cin>>T;
    while(T--){
        cin>>n;
        for(int i=1;i<=n;i++){
            scanf("%d",&input);
            a[input]=i;
        }
        for(int i=1;i<=n;i++){
            scanf("%d",&output);
            b[a[output]]=i;
        }
//      for(int i=1;i<=n;i++){
//          printf("%d ",a[i]);
//      }
//      cout<<'\n';
//      for(int i=1;i<=n;i++){
//          printf("%d ",b[i]);
//      }
//      cout<<'\n';
//      cout<<'\n';
        bool ok=1;
        int minn=b[1];
        for(int i=2;i<=n;i++){
            if(b[i]>minn){
                ok=0;
                break;
            }
            minn=min(minn,b[i]);
        }
        if(ok){
            cout<<"Yes\n";
        }else{
            cout<<"No\n";
        }
    }
    return 0;
}

by milai @ 2024-09-28 10:28:08

已暴力,求放过(还是0pts)

#include<bits/stdc++.h>
using namespace std;
int in[114514],out[114514];
int main(){
    int n,q;
    cin>>q;
    while(q--){
        cin>>n;
        for(int i=1;i<=n;i++){
            scanf("%d",&in[i]);
        }
        for(int i=1;i<=n;i++){
            scanf("%d",&out[i]);
        }
        int cnt1=2,cnt2=1;
        stack<int> st;
        st.push(in[1]);
        while(cnt1<=n+1&&cnt2<=n+1&&!st.empty()){
            if(st.top()!=out[cnt2]){
                if(cnt1>n+1){
                    break;
                }
                st.push(in[cnt1++]);
            }
            if(st.top()==out[cnt2]&&!st.empty()){
                cnt2++;
                st.pop();
            }
//          cout<<cnt1<<' '<<cnt2<<'\n';
        }
        if(cnt1==n+1&&cnt2==n+1){
            cout<<"Yes\n";
        }else{
            cout<<"No\n";
        }
    }
    return 0;
}

by milai @ 2024-09-28 10:37:08

老实了,模拟已过,此贴完


|