답안 #238011

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
238011 2020-06-09T17:31:39 Z Vimmer Retro (COCI17_retro) C++14
33 / 100
500 ms 284876 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: '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 173 ms 218232 KB Partially correct
2 Correct 155 ms 218104 KB Output is correct
3 Correct 172 ms 218016 KB Output is correct
4 Partially correct 175 ms 218104 KB Partially correct
5 Correct 160 ms 218104 KB Output is correct
6 Correct 176 ms 219768 KB Output is correct
7 Partially correct 212 ms 221944 KB Partially correct
8 Partially correct 312 ms 233208 KB Partially correct
9 Correct 403 ms 238328 KB Output is correct
10 Execution timed out 1112 ms 284876 KB Time limit exceeded
11 Execution timed out 1103 ms 254716 KB Time limit exceeded
12 Execution timed out 1107 ms 258708 KB Time limit exceeded
13 Execution timed out 1109 ms 256760 KB Time limit exceeded
14 Execution timed out 1113 ms 258168 KB Time limit exceeded
15 Execution timed out 1111 ms 254072 KB Time limit exceeded
16 Execution timed out 1053 ms 256376 KB Time limit exceeded
17 Execution timed out 1113 ms 247800 KB Time limit exceeded
18 Execution timed out 1109 ms 252920 KB Time limit exceeded
19 Execution timed out 1111 ms 253508 KB Time limit exceeded
20 Execution timed out 1112 ms 253944 KB Time limit exceeded