답안 #236086

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
236086 2020-05-31T07:28:47 Z ne4eHbKa Retro (COCI17_retro) C++17
8 / 100
165 ms 111608 KB
//{ <defines>
#include <bits/stdc++.h>
using namespace std;

//#pragma comment(linker, "/stack:200000000")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,-O3")

#define fr(i, n) for(int i = 0; i < n; ++i)
#define fo(n) fr(i, n)

#define re return
#define ef else if
#define ifn(x) if(!(x))
#define _  << ' ' <<

#define ft first
#define sd second
#define ve vector
#define pb push_back
#define eb emplace_back

#define sz(x) int((x).size())
#define bnd(x) x.begin(), x.end()
#define clr(x, y) memset((x), (y), sizeof (x))

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef ve<int> vi;

inline ll time() {re chrono :: system_clock().now().time_since_epoch().count();}
mt19937 rnd(time());
mt19937_64 RND(time());

template<typename t> inline void umin(t &a, t b) {a = min(a, b);}
template<typename t> inline void umax(t &a, t b) {a = max(a, b);}

int md = 998244353;

inline int m_add(int&a, int b) {a += b; if(a < 0) a += md; if(a >= md) a -= md; re a;}
inline int m_sum(int a, int b) {a += b; if(a < 0) a += md; if(a >= md) a -= md; re a;}
inline int m_mul(int&a, int b) {re a = 1ll * a * b % md;}
inline int m_prod(int a, int b) {re 1ll * a * b % md;}

int m_bpow(ll A, ll b) {
    int a = A % md;
    ll ans = 1;
    for(ll p = 1ll << 63 - __builtin_clzll(b); p; p >>= 1) {
        (ans *= ans) %= md;
        if(p & b)
            (ans *= a) %= md;
    }
    re ans;
}

//const ld pi = arg(complex<ld>(-1, 0));
//const ld pi2 = pi + pi;
const int oo = 2e9;
const ll OO = 4e18;
//} </defines>
const int N = 305;

int f[N][N][N];
string s[N];

int n, m;

int c(int i, int j, int b) {
    if(j >= 0 && j < m && (i < 0 || s[i][j] == '*') && !b) re 0;
    if(i < 0 || j < 0 || j >= m || b < 0 || b > i + 1 || s[i][j] == '*') re -1;
    if(f[i][j][b] < oo) re f[i][j][b];
    bool br = false;
    if(s[i][j] == ')') --b, br = true;
    if(s[i][j] == '(') ++b, br = true;
    f[i][j][b] = -1;
    for(int z = j - 1; z <= j + 1; ++z) {
        int v = c(i - 1, z, b);
        if(~v) umax(f[i][j][b], v + br);
    }
    re f[i][j][b];
}

void solve() {
    clr(f, 127);
    cin >> n >> m;
    fo(n) cin >> s[i];
    bool MK[2][m];
    clr(MK, 0);
    bool *mk = MK[0], *pr = MK[1];
    int M;
    for(int i = 0; i < m; ++i) if(s[n - 1][i] == 'M') M = i;
    mk[M] = true;
    int v = c(n - 1, M, 0), b = 0;
    cout << v << endl;
    string ans = "";
    for(int i = n - 2; ~i; --i) {
        if(!v) break;
        swap(pr, mk);
        bool op = false;
        bool cl = false;
        for(int j = 0; j < m; ++j) if(pr[j] || j && pr[j - 1] || j + 1 < m && pr[j + 1]) {
            mk[j] = false;
            if(c(i, j, b) >= v - 1) {
                mk[j] = true;
                if(s[i][j] == '(')
                    op = true;
                if(s[i][j] == ')')
                    cl = true;
            }
        }
        if(op) {
            ans += '(', ++b, --v;
            for(int j = 0; j < m; ++j)
                if(s[i][j] != '(') mk[j] = false;
        } ef(cl) {
            ans += ')', --b, --v;
            for(int j = 0; j < m; ++j)
                if(s[i][j] != ')') mk[j] = false;
        }
    }
    cout << ans << endl;
}

int main() {
#ifdef _LOCAL
    freopen("in.txt", "r", stdin);
    int tests; cin >> tests;
    for(int test = 1; test <= tests; ++test) {
		cerr << "case #" << test << endl;
        solve();
        cerr << endl;
    }
#else
//    freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
    ios_base :: sync_with_stdio(0); cin.tie(0); cout.tie(0);
    solve();
#endif
    return 0;
}

Compilation message

retro.cpp: In function 'int m_bpow(ll, ll)':
retro.cpp:50:26: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
     for(ll p = 1ll << 63 - __builtin_clzll(b); p; p >>= 1) {
                       ~~~^~~~~~~~~~~~~~~~~~~~
retro.cpp: In function 'void solve()':
retro.cpp:103:50: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
         for(int j = 0; j < m; ++j) if(pr[j] || j && pr[j - 1] || j + 1 < m && pr[j + 1]) {
                                                ~~^~~~~~~~~~~~
retro.cpp:103:76: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
         for(int j = 0; j < m; ++j) if(pr[j] || j && pr[j - 1] || j + 1 < m && pr[j + 1]) {
                                                                  ~~~~~~~~~~^~~~~~~~~~~~
retro.cpp:95:26: warning: 'M' may be used uninitialized in this function [-Wmaybe-uninitialized]
     int v = c(n - 1, M, 0), b = 0;
                          ^
# 결과 실행 시간 메모리 Grader output
1 Incorrect 59 ms 111352 KB Output isn't correct
2 Incorrect 58 ms 111352 KB Output isn't correct
3 Incorrect 59 ms 111352 KB Output isn't correct
4 Incorrect 58 ms 111352 KB Output isn't correct
5 Incorrect 61 ms 111352 KB Output isn't correct
6 Incorrect 60 ms 111484 KB Output isn't correct
7 Incorrect 59 ms 111224 KB Output isn't correct
8 Incorrect 62 ms 111352 KB Output isn't correct
9 Incorrect 61 ms 111352 KB Output isn't correct
10 Partially correct 63 ms 111352 KB Partially correct
11 Incorrect 134 ms 111608 KB Output isn't correct
12 Partially correct 128 ms 111608 KB Partially correct
13 Incorrect 99 ms 111480 KB Output isn't correct
14 Partially correct 95 ms 111608 KB Partially correct
15 Incorrect 161 ms 111480 KB Output isn't correct
16 Partially correct 142 ms 111480 KB Partially correct
17 Incorrect 140 ms 111480 KB Output isn't correct
18 Incorrect 138 ms 111480 KB Output isn't correct
19 Incorrect 165 ms 111608 KB Output isn't correct
20 Incorrect 151 ms 111480 KB Output isn't correct