답안 #238010

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
238010 2020-06-09T17:29:50 Z Vimmer Retro (COCI17_retro) C++14
33 / 100
500 ms 284920 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;


ll f[301][301][301], n, m;

vector <char> g, ans;

string s[301];

set <vector <char> > se[301][301];

bool low(vector <char> &a, vector <char> &b)
{
    for (int i = sz(a) - 1; i >= 0; i--)
    {
        if (a[i] == b[i]) continue;

        return a[i] == '(';
    }

    return 0;
}
void rec(int I, int J, int K, int val)
{
    if (se[I][J].find(g) != se[I][J].end()) return;

    se[I][J].insert(g);

    if (I == n - 1)
    {
        if (sz(ans) == 0 || low(g, ans)) ans = g;

        return;
    }

    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] != '#') rec(I + 1, a + J, K, val);

    if (s[I][J] != '.')
    {
        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] != '#') rec(I + 1, a + J, K, val);

            g.pop_back();
        }
        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] != '#') rec(I + 1, a + J, K, val);

            g.pop_back();
        }
    }
}
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);

    cin >> n >> m;

    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;

    ll I = -1, J, K = -1, st;

    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] == -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] != ')'))
                    {
                        ll 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] == -1 ||  f[i - 1][j + a][nk] < nw) f[i - 1][j + a][nk] = nw;
                    }
            }

    for (int i = 0; i < 301; i++)
        for (int j = 0; j < 301; j++)
          for (int u = 0; u < 301; u++)
            if (f[i][j][u] == u && K < u) {I = i; J = j; K = u;}

    if (I == -1) cout << 0 << endl;
     else
     {
        cout << K + K << endl;

        for (int i = 0; i < 301; i++)
          for (int j = 0; j < 301; j++)
              for (int u = 0; u < 301; u++)
                if (f[i][j][u] == u && K == u) rec(i, j, u, u);

         for (int i = sz(ans) - 1; i >= 0; i--) cout << ans[i];
     }
}

Compilation message

retro.cpp: In function 'int main()':
retro.cpp:110:16: warning: variable 'J' set but not used [-Wunused-but-set-variable]
     ll I = -1, J, K = -1, st;
                ^
retro.cpp:110:27: warning: unused variable 'st' [-Wunused-variable]
     ll I = -1, J, K = -1, st;
                           ^~
retro.cpp:108:18: warning: 'sy' may be used uninitialized in this function [-Wmaybe-uninitialized]
     f[sx][sy][0] = 0;
     ~~~~~~~~~~~~~^~~
retro.cpp:108:18: warning: 'sx' may be used uninitialized in this function [-Wmaybe-uninitialized]
# 결과 실행 시간 메모리 Grader output
1 Partially correct 156 ms 218104 KB Partially correct
2 Correct 162 ms 218104 KB Output is correct
3 Correct 164 ms 218232 KB Output is correct
4 Partially correct 167 ms 218104 KB Partially correct
5 Correct 159 ms 218104 KB Output is correct
6 Correct 181 ms 219868 KB Output is correct
7 Partially correct 194 ms 222072 KB Partially correct
8 Partially correct 332 ms 233360 KB Partially correct
9 Correct 411 ms 238456 KB Output is correct
10 Execution timed out 1103 ms 284920 KB Time limit exceeded
11 Execution timed out 1111 ms 256120 KB Time limit exceeded
12 Execution timed out 1101 ms 258088 KB Time limit exceeded
13 Execution timed out 1107 ms 256236 KB Time limit exceeded
14 Execution timed out 1114 ms 257144 KB Time limit exceeded
15 Execution timed out 1109 ms 254180 KB Time limit exceeded
16 Execution timed out 1104 ms 258040 KB Time limit exceeded
17 Execution timed out 1110 ms 248952 KB Time limit exceeded
18 Execution timed out 1107 ms 252536 KB Time limit exceeded
19 Execution timed out 1096 ms 252252 KB Time limit exceeded
20 Execution timed out 1110 ms 254584 KB Time limit exceeded