답안 #238213

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
238213 2020-06-10T09:11:17 Z Vimmer Retro (COCI17_retro) C++14
25 / 100
500 ms 214060 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> ans, g;

string s[301];

bool mk[301][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 b, int len)
//{
//    if (mk[i][j][b]) return;
//
//    mk[i][j][b] = 1;
//
//    if (i == n - 1) return;
//
//    for (int a = -1; a <= 1; a++)
//    {
//        int nb = b, nlen = len, jr = j + a;
//
//        if (jr < 0 || jr == m || s[i + 1][jr] == '*') continue;
//
//        if (s[i + 1][jr] == '(') {nb++; nlen++;}
//
//        if (s[i + 1][jr] == ')') {nb--; nlen++;}
//
//        if (nb == -1) continue;
//
//        if (f[i + 1][jr][nb] == nlen) rec(i + 1, jr, nb, nlen);
//    }
//}


void solve(int i, int j, int b, int len)
{
//    if (mk[i][j][b]) return;
//
//    mk[i][j][b] = 1;

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

        return;
    }

    if (s[i][j] == '(') {b--; len--; g.pb('(');}

    if (s[i][j] == ')') {b++; len--; g.pb(')');}

    for (int a = -1; a <= 1; a++)
    {
        int nb = b, nlen = len, jr = j + a;

        if (jr < 0 || jr == m || s[i + 1][jr] == '*') continue;

        if (nb == -1) continue;

       // cout << i + 1 << " " << jr << " " << nb << " " << nlen << " " << f[i + 1][jr][nb] << endl;

        if (f[i + 1][jr][nb] == nlen) solve(i + 1, jr, nb, nlen);
    }


    if (s[i][j] == '(') g.pop_back();

    if (s[i][j] == ')') 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;

    for (int i = n - 1; i > 0; i--)
        for (int j = 0; j < m; j++)
          for (int st = 0; st <= n - i - 1; st++)
            {
                if (f[i][j][st] == -1 || s[i][j] == '*') continue;

                for (int a = -1; a <= 1; a++)
                    if (a + j >= 0 && a + j < m && (st != 0 || s[i - 1][j + a] != ')'))
                    {
                        ll nw = f[i][j][st], nk = st;

                        if (s[i - 1][j + a] == '(') {nw++; nk++;}

                        if (s[i - 1][j + a] == ')') {nw++; nk--;}

                        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++)
            if (K < f[i][j][0]) {I = i; J = j; K = f[i][j][0];}

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

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

    cout << K << endl;

    reverse(ans.begin(), ans.end());

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

}

Compilation message

retro.cpp: In function 'int main()':
retro.cpp:129:8: warning: variable 'I' set but not used [-Wunused-but-set-variable]
     ll I = -1, J, K = -1;
        ^
retro.cpp:129:16: warning: variable 'J' set but not used [-Wunused-but-set-variable]
     ll I = -1, J, K = -1;
                ^
retro.cpp:127:18: warning: 'sx' may be used uninitialized in this function [-Wmaybe-uninitialized]
     f[sx][sy][0] = 0;
     ~~~~~~~~~~~~~^~~
retro.cpp:127:18: warning: 'sy' may be used uninitialized in this function [-Wmaybe-uninitialized]
# 결과 실행 시간 메모리 Grader output
1 Correct 100 ms 213880 KB Output is correct
2 Correct 103 ms 213880 KB Output is correct
3 Correct 101 ms 213752 KB Output is correct
4 Correct 103 ms 214008 KB Output is correct
5 Correct 105 ms 213876 KB Output is correct
6 Execution timed out 1106 ms 213880 KB Time limit exceeded
7 Execution timed out 1102 ms 213752 KB Time limit exceeded
8 Execution timed out 1097 ms 213752 KB Time limit exceeded
9 Execution timed out 1104 ms 213880 KB Time limit exceeded
10 Execution timed out 1096 ms 213880 KB Time limit exceeded
11 Execution timed out 1104 ms 213884 KB Time limit exceeded
12 Execution timed out 1107 ms 213880 KB Time limit exceeded
13 Execution timed out 1104 ms 213880 KB Time limit exceeded
14 Execution timed out 1094 ms 213880 KB Time limit exceeded
15 Execution timed out 1108 ms 213884 KB Time limit exceeded
16 Execution timed out 1106 ms 213880 KB Time limit exceeded
17 Execution timed out 1108 ms 213880 KB Time limit exceeded
18 Execution timed out 1103 ms 213880 KB Time limit exceeded
19 Execution timed out 1099 ms 214060 KB Time limit exceeded
20 Execution timed out 1107 ms 213880 KB Time limit exceeded