답안 #238013

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
238013 2020-06-09T17:33:06 Z Vimmer Retro (COCI17_retro) C++14
19 / 100
500 ms 266684 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 (K < val || 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: 'sx' may be used uninitialized in this function [-Wmaybe-uninitialized]
     f[sx][sy][0] = 0;
     ~~~~~~~~~~~~~^~~
retro.cpp:108:18: warning: 'sy' may be used uninitialized in this function [-Wmaybe-uninitialized]
# 결과 실행 시간 메모리 Grader output
1 Partially correct 166 ms 218104 KB Partially correct
2 Correct 157 ms 218104 KB Output is correct
3 Correct 160 ms 218104 KB Output is correct
4 Correct 157 ms 218232 KB Output is correct
5 Partially correct 161 ms 218088 KB Partially correct
6 Execution timed out 1102 ms 266684 KB Time limit exceeded
7 Execution timed out 1124 ms 259356 KB Time limit exceeded
8 Execution timed out 1111 ms 264476 KB Time limit exceeded
9 Execution timed out 1100 ms 262996 KB Time limit exceeded
10 Execution timed out 1109 ms 260472 KB Time limit exceeded
11 Execution timed out 1098 ms 249700 KB Time limit exceeded
12 Execution timed out 1106 ms 247928 KB Time limit exceeded
13 Execution timed out 1111 ms 248136 KB Time limit exceeded
14 Execution timed out 1103 ms 247964 KB Time limit exceeded
15 Execution timed out 1109 ms 248184 KB Time limit exceeded
16 Execution timed out 1103 ms 245880 KB Time limit exceeded
17 Execution timed out 1105 ms 246832 KB Time limit exceeded
18 Execution timed out 1101 ms 245120 KB Time limit exceeded
19 Execution timed out 1089 ms 245680 KB Time limit exceeded
20 Execution timed out 1109 ms 248100 KB Time limit exceeded