Submission #237362

# Submission time Handle Problem Language Result Execution time Memory
237362 2020-06-06T08:02:28 Z Vimmer Retro (COCI17_retro) C++14
50 / 100
500 ms 24376 KB
#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>

#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-O3")
#pragma GCC optimize("Ofast")
//#pragma GCC optimize("fast-math")
//#pragma GCC optimize("no-stack-protector")

#define F first
#define S second
#define sz(x) int(x.size())
#define pb push_back
#define N 100001
#define M ll(1e9 + 7)
#define inf 1e9 + 1e9

using namespace std;
//using namespace __gnu_pbds;

typedef long double ld;
typedef long long ll;
typedef short int si;
typedef array <int, 2> a2;

//typedef tree <int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;



vector <char> ans, ndp[301][32][32], dp[301][32][32];

bool nmk[301][32][32], mk[301][32][32];

//int f[301][301][301];

bool low(vector <char> &a, vector <char> &b)
{
    for (int i = 0; i < sz(a); i++)
    {
        if (a[i] == b[i]) continue;

        return a[i] == '(';
    }

    return 0;
}

int main()
{
    //freopen("input.txt", "r", stdin); //freopen("output4.txt", "w", stdout);

    ios_base::sync_with_stdio(0); istream::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    int n, m;

    cin >> n >> m;

    string s[n];

    for (int i = 0; i < n; i++) cin >> s[i];

    int sx, sy;

    for (int i = 0; i < m; i++)
        if (s[n - 1][i] == 'M') {sx = n - 1; sy = i; break;}

//    if (n <= 100)
//    {
        mk[sy][0][0] = 1;

        for (int i = n - 1; i >= 0; i--)
         {
            for (int j = 0; j < m; j++)
              for (int k = 0; k < min(30, n - i); k++)
                for (int kr = 0; kr <= k; kr++)
                {
                    if (!mk[j][k][kr]) continue;

                    if (k == kr && (k + kr > sz(ans) || (k + k == sz(ans) && low(dp[j][k][kr], ans)))) ans = dp[j][k][kr];

                    if (s[i][j] == '*' || i == 0) continue;

                    for (int a = -1; a <= 1; a++)
                        if (a + j >= 0 && a + j < m && (k != kr || s[i - 1][j + a] != ')'))
                        {
                            int nw = kr, nk = k;

                            vector <char> nr = dp[j][k][kr];

                            if (s[i - 1][j + a] == '(') {nr.pb('('); nk++;}

                            if (s[i - 1][j + a] == ')') {nr.pb(')'); nw++;}

                            if (!nmk[j + a][nk][nw] || low(nr, ndp[j + a][nk][nw])) {nmk[j + a][nk][nw] = 1; ndp[j + a][nk][nw] = nr;}
                        }
                }

            for (int j = 0; j < m; j++)
              for (int k = 0; k <= min(31, n - i); k++)
                for (int kr = 0; kr <= k; kr++) {dp[j][k][kr] = ndp[j][k][kr]; ndp[j][k][kr].clear(); mk[j][k][kr] = nmk[j][k][kr]; nmk[j][k][kr] = 0;}

        }
        cout << sz(ans) << endl;

        for (auto it : ans) cout << it;

        exit(0);
//    }
//
//    memset(f, -1, sizeof(f));
//
//    f[sx][sy][0] = 0;
//
//    int I = -1, J, K;
//
//    for (int i = n - 1; i > 0; i--)
//        for (int j = 0; j < m; j++)
//          for (int k = 0; k <= n - i - 1; k++)
//            {
//                if (f[i][j][k] == k && (I == -1 || K + K < k + k)) {I = i; J = j; K = k;}
//
//                if (f[i][j][k] == -1 || s[i][j] == '*') continue;
//
//                for (int a = -1; a <= 1; a++)
//                    if (a + j >= 0 && a + j < m && (f[i][j][k] < k || s[i - 1][j + a] != ')'))
//                    {
//                        int nw = f[i][j][k], nk = k;
//
//                        if (s[i - 1][j + a] == '(') nk++;
//
//                        if (s[i - 1][j + a] == ')') nw++;
//
//                        if (f[i - 1][j + a][nk] < nw) f[i - 1][j + a][nk] = nw;
//
//                    }
//            }
//
//    for (int j = 0; j < m; j++)
//        for (int k = 0; k <= n; k++)
//          if (f[0][j][k] == k && (I == -1 || K + K < k + k)) {I = 0; J = j; K = k;}
//
//    if (I == -1) cout << 0 << endl;
//     else
//     {
//         cout << K + K << endl;
//
//         int val = K;
//
//         vector <char> g; g.clear();
//
//         while (I != n - 1)
//         {
//                int pos = -1;
//
//                for (int a = -1; a <= 1; a++)
//                  if (a + J < m && a + J >= 0 && f[I + 1][a + J][K] == val && s[I + 1][a + J] != '#') pos = a + J;
//
//                if (pos == -1)
//                {
//                    if (s[I][J] == ')')
//                    {
//                        g.pb(')');
//
//                        val--;
//
//                        for (int a = -1; a <= 1; a++)
//                            if (a + J < m && a + J >= 0 && f[I + 1][a + J][K] == val && s[I + 1][a + J] != '#') pos = a + J;
//                    }
//                    else
//                    {
//                        g.pb('(');
//
//                        K--;
//
//                        for (int a = -1; a <= 1; a++)
//                            if (a + J < m && a + J >= 0 && f[I + 1][a + J][K] == val && s[I + 1][a + J] != '#') pos = a + J;
//                    }
//                }
//
//                J = pos;
//
//                I++;
//         }
//
//         for (int i = sz(g) - 1; i >= 0; i--) cout << g[i];
//     }
}

Compilation message

retro.cpp: In function 'int main()':
retro.cpp:63:9: warning: variable 'sx' set but not used [-Wunused-but-set-variable]
     int sx, sy;
         ^~
retro.cpp:70:22: warning: 'sy' may be used uninitialized in this function [-Wmaybe-uninitialized]
         mk[sy][0][0] = 1;
         ~~~~~~~~~~~~~^~~
# Verdict Execution time Memory Grader output
1 Correct 15 ms 14848 KB Output is correct
2 Correct 14 ms 14848 KB Output is correct
3 Correct 14 ms 14848 KB Output is correct
4 Correct 14 ms 14976 KB Output is correct
5 Correct 16 ms 15104 KB Output is correct
6 Correct 117 ms 16504 KB Output is correct
7 Correct 158 ms 17144 KB Output is correct
8 Correct 119 ms 16120 KB Output is correct
9 Correct 288 ms 17912 KB Output is correct
10 Correct 338 ms 18680 KB Output is correct
11 Execution timed out 1091 ms 24076 KB Time limit exceeded
12 Execution timed out 1092 ms 23656 KB Time limit exceeded
13 Execution timed out 1097 ms 20568 KB Time limit exceeded
14 Execution timed out 1090 ms 20600 KB Time limit exceeded
15 Execution timed out 1095 ms 24184 KB Time limit exceeded
16 Execution timed out 1095 ms 23852 KB Time limit exceeded
17 Execution timed out 1089 ms 24376 KB Time limit exceeded
18 Execution timed out 1081 ms 23880 KB Time limit exceeded
19 Execution timed out 1098 ms 24184 KB Time limit exceeded
20 Execution timed out 1091 ms 24012 KB Time limit exceeded