답안 #237361

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
237361 2020-06-06T08:02:06 Z Vimmer Retro (COCI17_retro) C++14
50 / 100
322 ms 10880 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[101][32][32], dp[101][32][32];

bool nmk[101][32][32], mk[101][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;
         ~~~~~~~~~~~~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 5120 KB Output is correct
2 Correct 8 ms 5248 KB Output is correct
3 Correct 7 ms 5248 KB Output is correct
4 Correct 8 ms 5248 KB Output is correct
5 Correct 9 ms 5376 KB Output is correct
6 Correct 112 ms 6904 KB Output is correct
7 Correct 152 ms 7672 KB Output is correct
8 Correct 110 ms 6520 KB Output is correct
9 Correct 300 ms 8288 KB Output is correct
10 Correct 322 ms 9080 KB Output is correct
11 Runtime error 14 ms 10496 KB Execution killed with signal 11 (could be triggered by violating memory limits)
12 Runtime error 13 ms 10624 KB Execution killed with signal 11 (could be triggered by violating memory limits)
13 Runtime error 14 ms 10880 KB Execution killed with signal 11 (could be triggered by violating memory limits)
14 Runtime error 13 ms 10880 KB Execution killed with signal 11 (could be triggered by violating memory limits)
15 Runtime error 13 ms 10624 KB Execution killed with signal 11 (could be triggered by violating memory limits)
16 Runtime error 13 ms 10624 KB Execution killed with signal 11 (could be triggered by violating memory limits)
17 Runtime error 13 ms 10496 KB Execution killed with signal 11 (could be triggered by violating memory limits)
18 Runtime error 13 ms 10496 KB Execution killed with signal 11 (could be triggered by violating memory limits)
19 Runtime error 13 ms 10496 KB Execution killed with signal 11 (could be triggered by violating memory limits)
20 Runtime error 13 ms 10496 KB Execution killed with signal 11 (could be triggered by violating memory limits)