D. Shortest and Longest LIS-1034(LIS+构造)

题目链接
题意:构造一个min的LIS,跟一个max的LIS

void f1(int n,vector<pair<int,int> > vec)
{
    int len=vec.size(),cnt=n+1;
    vec[0].F++;
    vector<int>ans;
    for(int i=0;i<len;i++)
    {
        vec[i].F--,vec[i].S++;
    //    cout<<vec[i].F<<" "<<vec[i].S<<endl;
        while(vec[i].F--)
            ans.pb(cnt--);
        int num=cnt-vec[i].S+1;
        cnt-=vec[i].S;
        while(vec[i].S--)
            ans.pb(num++);
    }
    for(auto it:ans)
        cout<<it<<" ";
    cout<<endl;

}
void f2(int n,vector<pair<int,int> > vec)
{
    int len=vec.size(),cnt=1;
    vec[len-1].S++;
    vector<int>ans;
    for(int i=0;i<len;i++)
    {
        int num=cnt+vec[i].S;
        stack<int>st;
        while(vec[i].F--)
            st.push(num++);
        while(!st.empty())
            ans.pb(st.top()),st.pop();
        while(vec[i].S--)
            ans.pb(cnt++);
        cnt=num;
    }
    for(auto it:ans)
        cout<<it<<" ";
    cout<<endl;
}
signed main()
{
    IOS;
    file();
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        string str;
        vector<pair<int,int> >vec;
        cin>>n>>str;
        int a[2]={0};
        for(int i=0;i<n-1;i++)
        {
            str[i]=='>'?a[0]++:a[1]++;
            if(str[i]=='<'&&str[i+1]=='>'&&i<n-2||i==n-2)
            {
                vec.pb( {a[0],a[1]} );
               // cout<<a[0]<<" "<<a[1]<<endl;
                memset(a,0);
            }
        }
        f1(n-1,vec);
        f2(n-1,vec);
    }
    return 0;
}
发布了130 篇原创文章 · 获赞 5 · 访问量 4981

猜你喜欢

转载自blog.csdn.net/weixin_44224825/article/details/104358373