답안 #236239

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
236239 2020-05-31T18:19:14 Z Vimmer Retro (COCI17_retro) C++14
60 / 100
500 ms 155640 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][101][101], dp[101][101][101];

bool nmk[101][101][101], mk[101][101][101];

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 < 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 <= 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:121:58: warning: 'K' may be used uninitialized in this function [-Wmaybe-uninitialized]
                 if (f[i][j][k] == k && (I == -1 || K + K < k + k)) {I = i; J = j; K = k;}
                                                    ~~~~~~^~~~~~~
retro.cpp:70:22: warning: 'sy' may be used uninitialized in this function [-Wmaybe-uninitialized]
         mk[sy][0][0] = 1;
         ~~~~~~~~~~~~~^~~
retro.cpp:113:18: warning: 'sx' may be used uninitialized in this function [-Wmaybe-uninitialized]
     f[sx][sy][0] = 0;
     ~~~~~~~~~~~~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 34 ms 48788 KB Output is correct
2 Correct 32 ms 49024 KB Output is correct
3 Correct 39 ms 48888 KB Output is correct
4 Correct 32 ms 49024 KB Output is correct
5 Correct 32 ms 49916 KB Output is correct
6 Correct 201 ms 51704 KB Output is correct
7 Correct 273 ms 52728 KB Output is correct
8 Correct 187 ms 50808 KB Output is correct
9 Execution timed out 525 ms 53880 KB Time limit exceeded
10 Execution timed out 570 ms 54776 KB Time limit exceeded
11 Partially correct 137 ms 155640 KB Partially correct
12 Partially correct 138 ms 155512 KB Partially correct
13 Partially correct 110 ms 155512 KB Partially correct
14 Partially correct 110 ms 155512 KB Partially correct
15 Partially correct 149 ms 155512 KB Partially correct
16 Partially correct 144 ms 155512 KB Partially correct
17 Partially correct 143 ms 155640 KB Partially correct
18 Partially correct 135 ms 155512 KB Partially correct
19 Partially correct 149 ms 155640 KB Partially correct
20 Partially correct 143 ms 155512 KB Partially correct