Submission #61272

#TimeUsernameProblemLanguageResultExecution timeMemory
61272Miyukineparentrises (BOI18_parentrises)C++14
100 / 100
165 ms3784 KiB
#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for (int i=(a); i<=(b); ++i)
const int maxn = 1e6 + 5;
typedef pair <int, int> PII;
typedef long long ll;
const int mod = 1e9 + 7;

int dp[2][605][605];
//dp[length][stacksize in RG][stacksize in RB]
int type, n;
string s;
int stos[1000100], DL = 0;
char arr[1000100];
int result[305];

void solveone()
{
	cin >> s;
	int m = (int)s.size();
	DL = 0;
	for (int i = 0; i < m; ++i)
	{
		if (s[i] == '(') stos[++DL] = i, arr[i] = 'R';
		else
		{
			if (DL > 0) 
			{
				arr[stos[DL]] = 'B';
				arr[i] = 'B';
				DL--;
			}
			else arr[i] = 'R';
		}
	}
	
	int wait = 0;
	for (int i = 0; i < m; ++i)
		if (arr[i] == 'R' && s[i] == '(') ++wait;
		else if (arr[i] == 'B' && s[i] == ')' && wait > 0)
		{
			--wait;
			arr[i] = 'G';
		}
	
	if (wait > 0)
	{
		cout << "impossible\n";
		return;
	}
	wait = 0;
	for (int i = m - 1; i >= 0; --i)
	{
		if (arr[i] == 'R' && s[i] == ')') ++wait;
		else if (arr[i] == 'B' && s[i] == '(' && wait > 0)
		{
			--wait;
			arr[i] = 'G';
		}
	}
	if (wait > 0)
	{
		cout << "impossible\n";
		return;
	}
	
	for (int i = 0; i < m; ++i) cout << arr[i];
	cout << "\n";
}

inline void addmod(int &x, int v) { x += v; while (x >= mod) x -= mod; }

int main()
{
	ios_base::sync_with_stdio(false);
	cin >> type;
	if (type == 1)
	{
		cin >> n;
		for (int i=0; i<n; ++i) solveone();
	}
	if (type == 2)
	{
		int tests;
		n = 301;
		dp[0][0][0] = 1; //one sequence
		for (int i=1; i<=n; ++i)
		{
			FOR(j, 0, 604)
				FOR(k, 0, 604) dp[i & 1][j][k] = 0;
			
			FOR(j, 0, i)
				FOR(k, j, 2 * i)
				{
					//i have two options: either update with ) or with (
					if (k) addmod(dp[i & 1][max(j - 2, 0)][k - 1], dp[(i & 1) ^ 1][j][k]);
					addmod(dp[i & 1][j + 1][k + 2], dp[(i & 1) ^ 1][j][k]);
				}
			
			for (int j = 0; j <= 604; ++j) addmod(result[i], dp[i & 1][0][j]);
		}

		cin >> tests;
		while (tests--)
		{
			cin >> n;
			cout << result[n] << "\n";
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...