補題記錄——Codeforces Round #620 (Div. 2) D. Shortest and Longest LIS

在這裏插入圖片描述在這裏插入圖片描述可以這麼想,最短的就是把最大的放在前面,最長的就是最小的放在前面,例如
7,>><>><,先生成一個,7654321,再根據小於號顛倒,同理,1234567,根據正負號顛倒。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
char s[200005];
int a[200005];
void solve()
{
   int n, m;
   cin >> n >> s;
   m = n;
   for (int i = 0; i < n; i++)
   {
	   int st = 1;
	   while (i < strlen(s) && s[i] == '<')
	   {
		   st++;
		   i++;
	   }
	   for (int j = i; j > i - st; 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 st = 1;
		while (i < strlen(s) && s[i] == '>')
		{
			st++;
			i++;
		}
		for (int j = i; j > i - st; j--)
		{
			a[j] = m;
			m++;
		}
   }
   for (int i = 0; i < n; i++)
	   cout << a[i] << " ";
   cout << endl;
}
int main()
{
	int t;
	cin >> t;
	while (t--)
		solve();
}

既然思路如此,那就有個更簡單的代碼。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
char s[200005];
int a[200005];
int b[200005];
void swap(int a_, int b_)  //交換的一個函數,將傳入的數組中的一段倒置。
{	for (int i = a_; i<=b_; i++)
	{
	   b[i] = a[b_-(i-a_)];
	}
	for (int i = a_; i <= b_; i++)
	{
		a[i] = b[i];
	}

}
void solve()
{
   int n, m;
   cin >> n >> s;
   m = n;
   for (int i = 0; i < n; i++)
   {
	   a[i] = m;
	   m--;
   }
   for (int i = 0; i < n; i++)
   {
	   if (s[i] == '<')
	   {
		   int j = i;
		   int c = 1;
		   while (s[i] == '<')
		   {
			   c++;
			   i++;
		   }
		   swap(j, j+c-1);
	   }

   }
   for (int i = 0; i < n; i++)
   {
	   cout << a[i] << " ";
   }
   cout << endl;
   m = 1;
   for (int i = 0; i < n; i++)
   {
	   a[i] = m;
	   m++;
   }
   for (int i = 0; i < n; i++)
   {
	   if (s[i] == '>')
	   {
		   int j = i;
		   int c = 1;
		   while (s[i] == '>')
		   {
			   c++;
			   i++;
		   }
		   swap(j, j + c - 1);
	   }

   }
   for (int i = 0; i < n; i++)
   {
	   cout << a[i] << " ";
   }
   cout << endl;
}
int main()
{
	int t;
	cin >> t;
	while (t--)
		solve();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章