Submission #381172

# Submission time Handle Problem Language Result Execution time Memory
381172 2021-03-24T16:47:56 Z VodkaInTheJar parentrises (BOI18_parentrises) C++14
72 / 100
228 ms 12284 KB
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#define endl '\n'

using namespace std;

const int mod = 1e9 + 7;

int add(int a, int b)
{
	a += b;
	if (a >= mod)
	a -= mod;
	
	return a;
}

int p, t;
void read()
{
	cin >> p >> t;
}

const int maxn = 103;

int dp[maxn][maxn * 2];
int ans[maxn];
void solve()
{
	for (int i = -100; i <= 100; i++)
	for (int j = 1; j <= 100; j++)
	{
		if (3 * i > j || i < -j || i > j)
		continue;
		
		memset(dp, 0, sizeof(dp));
		
		dp[0][j] = 1;
		for (int p = 1; p <= j; p++)
		for (int k = 0; k <= 2 * j; k++)
		{
			int k1 = k - j;
			if (3 * k1 < -p || 3 * (i - k1) > j - p)
			continue;
			
			if (k)
			dp[p][k] = add(dp[p][k], dp[p-1][k-1]);
			
			if (k < 2 * j)
			dp[p][k] = add(dp[p][k], dp[p-1][k+1]);
		}
		  
		ans[j] = add(ans[j], dp[j][i+j]);
	}
	
	while (t--)
	{
		if (p == 1)
		{
			string s;
			cin >> s; 
			
			int n = (int)s.size();
			vector <int> color(n, 0);
			
			stack <int> st;
			for (int i = 0; i < n; i++)
			{
				if (s[i] == '(')
				st.push(i);
				
				else 
				{
					if (!st.empty())
					{
						color[st.top()] += 1; 
						color[i] += 1; 
						
						st.pop();
					}
				}
			}
			
			while (!st.empty())
			st.pop();
			
			vector <int> to_add, to_sub;
		    for (int i = 0; i < n; i++)
		    if (color[i])
		    {
				if (s[i] == '(')
				to_add.push_back(i);
				
				
				else 
				to_sub.push_back(i);
			}
			
			reverse(to_sub.begin(), to_sub.end());
			
			int balance = 0, min_bb = 0;
			for (int i = 0; i < n; i++)
			if (!color[i])
			{
				if (s[i] == '(')
				balance++;
				
				else 
				balance--;
				
				min_bb = min(min_bb, balance);
			}
			
			bool can = false; 
			for (int i = -min_bb; i <= min((int)to_add.size(), -min_bb); i++)
			{
				int curr_balance = balance + i;
				if (curr_balance < 0)
				continue;
				
				if (curr_balance > (int)to_sub.size())
				continue;
				
			    vector <bool> is(n, false);
			    for (int j = 0; j < i; j++)
			    is[to_add[j]] = true; 
			    
			    for (int j = 0; j < curr_balance; j++)
			    is[to_sub[j]] = true; 
			    
			    int bb = 0;
			    bool curr_can = true;
			    for (int j = 0; j < n; j++)
			    {
					if (!color[j] || is[j])
					{
						if (s[j] == '(')
						bb++;
						
						else 
						bb--;
					}
					
					if (bb < 0)
					{
						curr_can = false;
						break;
					}
				}
				
				if (curr_can)
				{ 
					for (int j = 0; j < n; j++)
					if (!color[j] || is[j])
					color[j] += 2; 
					
					can = true;
					break;
				}
			}
			
			if (!can)
			cout << "impossible" << endl;
			
			else 
			{
				for (int i = 0; i < n; i++)
				{
					if (color[i] == 3)
					cout << "G";
					
					else
					if (color[i] == 1)
					cout << "B";
					
					else 
					cout << "R"; 
				}
				
				cout << endl; 
			}
 		}
 		
 		else 
 		{
			int n;
			cin >> n;
			
			if (n <= 100)
			cout << ans[n] << endl; 
		}
	}
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	
	read();
	solve();
}
# Verdict Execution time Memory Grader output
1 Correct 155 ms 364 KB Output is correct
2 Correct 150 ms 364 KB Output is correct
3 Correct 160 ms 480 KB Output is correct
4 Correct 148 ms 364 KB Output is correct
5 Correct 147 ms 364 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 181 ms 492 KB Output is correct
2 Correct 157 ms 364 KB Output is correct
3 Correct 154 ms 480 KB Output is correct
4 Correct 159 ms 400 KB Output is correct
5 Correct 152 ms 384 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 181 ms 492 KB Output is correct
2 Correct 157 ms 364 KB Output is correct
3 Correct 154 ms 480 KB Output is correct
4 Correct 159 ms 400 KB Output is correct
5 Correct 152 ms 384 KB Output is correct
6 Correct 155 ms 480 KB Output is correct
7 Correct 158 ms 480 KB Output is correct
8 Correct 183 ms 480 KB Output is correct
9 Correct 153 ms 480 KB Output is correct
10 Correct 153 ms 492 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 181 ms 492 KB Output is correct
2 Correct 157 ms 364 KB Output is correct
3 Correct 154 ms 480 KB Output is correct
4 Correct 159 ms 400 KB Output is correct
5 Correct 152 ms 384 KB Output is correct
6 Correct 155 ms 480 KB Output is correct
7 Correct 158 ms 480 KB Output is correct
8 Correct 183 ms 480 KB Output is correct
9 Correct 153 ms 480 KB Output is correct
10 Correct 153 ms 492 KB Output is correct
11 Correct 151 ms 516 KB Output is correct
12 Correct 152 ms 620 KB Output is correct
13 Correct 148 ms 492 KB Output is correct
14 Correct 149 ms 492 KB Output is correct
15 Correct 152 ms 620 KB Output is correct
16 Correct 190 ms 624 KB Output is correct
17 Correct 158 ms 1712 KB Output is correct
18 Correct 167 ms 724 KB Output is correct
19 Correct 192 ms 1308 KB Output is correct
20 Correct 159 ms 1708 KB Output is correct
21 Correct 212 ms 2284 KB Output is correct
22 Correct 212 ms 12284 KB Output is correct
23 Correct 203 ms 3596 KB Output is correct
24 Correct 228 ms 6948 KB Output is correct
25 Correct 210 ms 12124 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 151 ms 364 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 151 ms 364 KB Output is correct
2 Correct 170 ms 480 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 151 ms 364 KB Output is correct
2 Correct 170 ms 480 KB Output is correct
3 Incorrect 164 ms 480 KB Output isn't correct