답안 #236241

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
236241 2020-05-31T18:19:51 Z Vimmer Retro (COCI17_retro) C++14
65 / 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 32 ms 48760 KB Output is correct
2 Correct 31 ms 48888 KB Output is correct
3 Correct 32 ms 48760 KB Output is correct
4 Correct 33 ms 49024 KB Output is correct
5 Correct 36 ms 49920 KB Output is correct
6 Correct 173 ms 51704 KB Output is correct
7 Correct 257 ms 52728 KB Output is correct
8 Correct 188 ms 50808 KB Output is correct
9 Correct 462 ms 53932 KB Output is correct
10 Execution timed out 533 ms 54648 KB Time limit exceeded
11 Partially correct 127 ms 155512 KB Partially correct
12 Partially correct 129 ms 155604 KB Partially correct
13 Partially correct 102 ms 155512 KB Partially correct
14 Partially correct 103 ms 155516 KB Partially correct
15 Partially correct 138 ms 155512 KB Partially correct
16 Partially correct 133 ms 155640 KB Partially correct
17 Partially correct 134 ms 155512 KB Partially correct
18 Partially correct 123 ms 155512 KB Partially correct
19 Partially correct 141 ms 155640 KB Partially correct
20 Partially correct 132 ms 155512 KB Partially correct