답안 #237366

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
237366 2020-06-06T08:46:04 Z Vimmer Retro (COCI17_retro) C++14
24 / 100
500 ms 431464 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;

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

vector <char> ans;

queue <pair <vector <char>, array <int, 4> > > qr;

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;}

    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;

         qr.push({ans, {I, J, K, K}});

         while (sz(qr) > 0)
         {
            int I = qr.front().S[0], J = qr.front().S[1], K = qr.front().S[2], val = qr.front().S[3];

            vector <char> g = qr.front().F; qr.pop();

            if (I == n - 1)
            {
                reverse(g.begin(), g.end());

                if (sz(ans) == 0 || low(g, ans)) ans = g;

                continue;
            }

            vector <int> posr; posr.clear();

            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] != '#') posr.pb(a + J);

            if (sz(posr) == 0)
            {
                int pos;

                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++;

                qr.push({g, {I, J, K, val}});
            }

            else
                for (auto pos : posr)
                {
                    J = pos;

                    qr.push({g, {I + 1, J, K, val}});
                }
         }

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

Compilation message

retro.cpp: In function 'int main()':
retro.cpp:68:18: warning: 'sx' may be used uninitialized in this function [-Wmaybe-uninitialized]
     f[sx][sy][0] = 0;
     ~~~~~~~~~~~~~^~~
retro.cpp:68:18: warning: 'sy' may be used uninitialized in this function [-Wmaybe-uninitialized]
retro.cpp:96:52: warning: 'K' may be used uninitialized in this function [-Wmaybe-uninitialized]
           if (f[0][j][k] == k && (I == -1 || K + K < k + k)) {I = 0; J = j; K = k;}
                                              ~~~~~~^~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Partially correct 61 ms 107000 KB Partially correct
2 Correct 63 ms 107128 KB Output is correct
3 Partially correct 60 ms 107128 KB Partially correct
4 Partially correct 59 ms 107000 KB Partially correct
5 Partially correct 60 ms 107000 KB Partially correct
6 Correct 63 ms 107128 KB Output is correct
7 Partially correct 61 ms 107128 KB Partially correct
8 Partially correct 64 ms 107256 KB Partially correct
9 Execution timed out 1110 ms 324556 KB Time limit exceeded
10 Partially correct 184 ms 128768 KB Partially correct
11 Execution timed out 1104 ms 184240 KB Time limit exceeded
12 Execution timed out 1102 ms 284700 KB Time limit exceeded
13 Execution timed out 1100 ms 132764 KB Time limit exceeded
14 Execution timed out 1103 ms 132756 KB Time limit exceeded
15 Execution timed out 1106 ms 183216 KB Time limit exceeded
16 Execution timed out 1101 ms 135168 KB Time limit exceeded
17 Execution timed out 1107 ms 229568 KB Time limit exceeded
18 Execution timed out 1117 ms 431464 KB Time limit exceeded
19 Execution timed out 1102 ms 147700 KB Time limit exceeded
20 Execution timed out 1100 ms 247468 KB Time limit exceeded