1304D Shortest and Longest LIS

题意:
第一行输入T,有T组测试。
每组测试为一行,输入一个n 和长度为n-1的仅由< >组成的字符串,<代表左边的比数要比右边的数小,反之大。
输出:
第一行:用1~n结合符号构造一种最短的LIS(Longest Increasing Subsequence 最长上升子序列)并输出如何构造。
第二行:用1~n结合符号构造一种最长的LIS(Longest Increasing Subsequence 最长上升子序列)并输出如何构造。

思路:
贪心+模拟
贪心要使LIS最短即最前面的数越大越好,要使LIS最长即最前面的数越小越好,再结合符号满足题意的方案模拟并保存输出。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 +7;
const ll MAXN = 2e5 + 5;

int n,m,a[MAXN],b[MAXN];
string s;

void solve(){
	cin>>n>>s;
	m=n;
	for(int i=0;i<n;i++){
		int len=1;
		while(i<s.size() && s[i]=='<'){
			len++;
			i++;
		}
		for(int j=i;j>i-len;j--){
			a[j]=m;
			m--;
		}
	}
	for(int i=0;i<n;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	m=1;
	for(int i=0;i<n;i++){
		int len=1;
		while(i<s.size() && s[i]=='>'){
			len++;
			i++;
		}
		for(int j=i;j>i-len;j--){
			b[j]=m;
			m++;
		}
	} 
	for(int i=0;i<n;i++){
		cout<<b[i]<<" ";
	}
	cout<<endl;
}

int main(){
	int T;cin>>T;
	while(T--){
		solve();
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值