답안 #238009

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
238009 2020-06-09T17:29:02 Z Vimmer Retro (COCI17_retro) C++14
19 / 100
500 ms 271020 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 169 ms 218232 KB Partially correct
2 Correct 155 ms 218108 KB Output is correct
3 Correct 156 ms 218028 KB Output is correct
4 Correct 160 ms 218232 KB Output is correct
5 Partially correct 159 ms 218104 KB Partially correct
6 Execution timed out 1115 ms 271020 KB Time limit exceeded
7 Execution timed out 1116 ms 269176 KB Time limit exceeded
8 Execution timed out 1101 ms 265976 KB Time limit exceeded
9 Execution timed out 1110 ms 267136 KB Time limit exceeded
10 Execution timed out 1108 ms 263416 KB Time limit exceeded
11 Execution timed out 1104 ms 252408 KB Time limit exceeded
12 Execution timed out 1107 ms 250364 KB Time limit exceeded
13 Execution timed out 1112 ms 250412 KB Time limit exceeded
14 Execution timed out 1106 ms 249300 KB Time limit exceeded
15 Execution timed out 1106 ms 250456 KB Time limit exceeded
16 Execution timed out 1100 ms 248144 KB Time limit exceeded
17 Execution timed out 1109 ms 249336 KB Time limit exceeded
18 Execution timed out 1109 ms 247480 KB Time limit exceeded
19 Execution timed out 1108 ms 248312 KB Time limit exceeded
20 Execution timed out 1109 ms 249780 KB Time limit exceeded