답안 #237360

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
237360 2020-06-06T08:01:33 Z Vimmer Retro (COCI17_retro) C++14
70 / 100
323 ms 112256 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: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:113:18: warning: 'sy' may be used uninitialized in this function [-Wmaybe-uninitialized]
     f[sx][sy][0] = 0;
     ~~~~~~~~~~~~~^~~
retro.cpp:113:18: warning: 'sx' may be used uninitialized in this function [-Wmaybe-uninitialized]
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 5120 KB Output is correct
2 Correct 8 ms 5248 KB Output is correct
3 Correct 8 ms 5248 KB Output is correct
4 Correct 9 ms 5248 KB Output is correct
5 Correct 10 ms 5504 KB Output is correct
6 Correct 111 ms 7032 KB Output is correct
7 Correct 146 ms 7604 KB Output is correct
8 Correct 106 ms 6440 KB Output is correct
9 Correct 286 ms 8312 KB Output is correct
10 Correct 323 ms 9080 KB Output is correct
11 Partially correct 108 ms 111992 KB Partially correct
12 Partially correct 104 ms 111992 KB Partially correct
13 Partially correct 84 ms 111992 KB Partially correct
14 Partially correct 85 ms 112064 KB Partially correct
15 Partially correct 119 ms 112124 KB Partially correct
16 Partially correct 111 ms 112120 KB Partially correct
17 Partially correct 110 ms 112120 KB Partially correct
18 Partially correct 105 ms 112256 KB Partially correct
19 Partially correct 125 ms 111992 KB Partially correct
20 Partially correct 112 ms 112080 KB Partially correct