Shortest and Longest LIS

Codeforces Round #620 (Div. 2)

D. Shortest and Longest LIS

题解:

贪心即可,对于最短序列,我们尽可能用可用的最大数字放入序列中,对于最长序列,我们尽可能用可用的最小数组放入序列即可,再处理序列时,当满足当前防止变化规律的符号直接防止,如果不满足则向后遍历直到遇到满足条件的符号,然后倒序放直到放完。eg. “><<>” 我们从大向小取,第一个为大于号所以直接填入,第二为小于号暂时不填,第三为小于号暂时不填,第四个为大于号,开始填,直到填到第二位结束,最后一个放在最后即可。

/**********************************************************
* @Author: 			   Maple
* @Date:   			   2020-02-24 16:40:40
* @Last Modified by:   Maple
* @Last Modified time: 2020-02-24 16:49:03
* @Remark: 
**********************************************************/
#include <bits/stdc++.h>
#define lowbit(x) (x&(-x))
#define CSE(x,y) memset(x,y,sizeof(x))
#define INF 0x3f3f3f3f
#define Abs(x) (x>=0?x:(-x))
#define FAST ios::sync_with_stdio(false);cin.tie(0);
using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll , ll> pll;

const int maxn=2e5+100;
int n,ans[maxn];
char str[maxn];

int main()
{
	#ifndef ONLINE_JUDGE
	freopen("in.in","r",stdin);
	#endif
	int t;
	cin>>t;
	while(t--){
		cin>>n;
		cin>>str;
		int num=n,ls=0;
		//最短排列
		for(int i=0;i<n;i++){
			if(str[i]=='>'||i==n-1){
				for(int j=i;j>=ls;j--){
					ans[j]=num--;
				}
				ls=i+1;
			}
		}
		for(int i=0;i<n;i++)
			cout<<ans[i]<<" ";
		cout<<endl;
		num=1,ls=0;
		//最长排列
		for(int i=0;i<n;i++){
			if(str[i]=='<'||i==n-1){
				for(int j=i;j>=ls;j--){
					ans[j]=num++;
				}
				ls=i+1;
			}
		}
		for(int i=0;i<n;i++)
			cout<<ans[i]<<" ";
		cout<<endl;
	}
	return 0;
}
posted @ 2020-02-24 17:05  落水清心  阅读(191)  评论(0编辑  收藏  举报