QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#186056#5537. Storing EggsSorahISAWA 97ms4544kbC++209.1kb2023-09-23 03:11:212023-09-23 03:11:22

Judging History

This is the latest submission verdict.

  • [2023-09-23 03:11:22]
  • Judged
  • Verdict: WA
  • Time: 97ms
  • Memory: 4544kb
  • [2023-09-23 03:11:21]
  • Submitted

answer

#ifndef Yamada
#define Yamada
#include Yamada __FILE__ Yamada

void solve() {
    int N, K; cin >> N >> K;
    
    vector<string> grid(3);
    for (string &str : grid) cin >> str;
    
    int empty_space = count(ALL(grid[0]), '.') + count(ALL(grid[1]), '.') + count(ALL(grid[2]), '.');
    if (K > empty_space) return cout << -1 << "\n", void();
    
    vector<int> one_row;
    for (int i = 0; i < N; ++i) {
        if (grid[0][i] == '.' or grid[1][i] == '.' or grid[2][i] == '.') one_row.eb(i);
    }
    
    auto calc = [&](int thres) -> bool {
        if (thres == 0) return true;
        for (int lst = -thres, cnt = 0; int x : one_row) {
            if (x >= lst + thres) lst = x, ++cnt;
            if (cnt >= K) return true;
        }
        return false;
    };
    
    int lo = 0, hi = N-1, mi;
    while (lo < hi) {
        mi = (lo + hi + 1) >> 1;
        if (calc(mi)) lo = mi;
        else          hi = mi - 1;
    }
    
    auto chk = [&](int d, int c, int D) -> bool {
        // debug(d, c, D);
        if (D <= 1) return true;
        else if (D == 2) {
            vector dp(N+1, vector(K+1, vector<bool>(5, false)));
            dp[0][0][0] = 1;
            for (int i = 1; i <= N; ++i) {
                dp[i][0][0] = 1;
                for (int k = 1; k <= K; ++k) {
                    dp[i][k][0] = dp[i-1][k][0] or dp[i-1][k][1] or dp[i-1][k][2] or dp[i-1][k][3] or dp[i-1][k][4];
                    dp[i][k][1] = grid[0][i-1] == '.' and (k == 1 or dp[i-1][k-1][0] or dp[i-1][k-1][2] or dp[i-1][k-1][3]);
                    dp[i][k][2] = grid[1][i-1] == '.' and (k == 1 or dp[i-1][k-1][0] or dp[i-1][k-1][1] or dp[i-1][k-1][3] or dp[i-1][k-1][4]);
                    dp[i][k][3] = grid[2][i-1] == '.' and (k == 1 or dp[i-1][k-1][0] or dp[i-1][k-1][1] or dp[i-1][k-1][2]);
                    dp[i][k][4] = grid[0][i-1] == '.' and grid[2][i-1] == '.' and (k >= 2 ? k == 2 or dp[i-1][k-2][0] or dp[i-1][k-2][2] : false);
                }
            }
            return (dp[N][K][0] or dp[N][K][1] or dp[N][K][2] or dp[N][K][3] or dp[N][K][4]);
        }
        else if (D == 4) {
            vector dp(N+1, vector(K+1, vector<bool>(5, false)));
            dp[0][0][0] = 1;
            for (int i = 1; i <= N; ++i) {
                dp[i][0][0] = 1;
                for (int k = 1; k <= K; ++k) {
                    dp[i][k][0] = dp[i-1][k][0] or dp[i-1][k][1] or dp[i-1][k][2] or dp[i-1][k][3] or dp[i-1][k][4];
                    dp[i][k][1] = grid[0][i-1] == '.' and (k == 1 or dp[i-1][k-1][0] or dp[i-1][k-1][3]);
                    dp[i][k][2] = grid[1][i-1] == '.' and (k == 1 or dp[i-1][k-1][0]);
                    dp[i][k][3] = grid[2][i-1] == '.' and (k == 1 or dp[i-1][k-1][0] or dp[i-1][k-1][1]);
                    dp[i][k][4] = grid[0][i-1] == '.' and grid[2][i-1] == '.' and (k >= 2 ? k == 2 or dp[i-1][k-2][0] : false);
                }
            }
            return (dp[N][K][0] or dp[N][K][1] or dp[N][K][2] or dp[N][K][3] or dp[N][K][4]);
        }
        else if (D == 5) {
            vector dp(N+1, vector(K+1, vector<bool>(4, false)));
            dp[0][0][0] = 1;
            for (int i = 1; i <= N; ++i) {
                dp[i][0][0] = 1;
                for (int k = 1; k <= K; ++k) {
                    dp[i][k][0] = dp[i-1][k][0] or dp[i-1][k][1] or dp[i-1][k][2] or dp[i-1][k][3];
                    dp[i][k][1] = grid[0][i-1] == '.' and (k == 1 or (i >= 2 ? dp[i-2][k-1][0] or dp[i-2][k-1][2] or dp[i-2][k-1][3] : false) or (dp[i-1][k-1][3]));
                    dp[i][k][2] = grid[1][i-1] == '.' and (k == 1 or (i >= 2 ? dp[i-2][k-1][0] or dp[i-2][k-1][1] or dp[i-2][k-1][3] : false));
                    dp[i][k][3] = grid[2][i-1] == '.' and (k == 1 or (i >= 2 ? dp[i-2][k-1][0] or dp[i-2][k-1][1] or dp[i-2][k-1][2] : false) or (dp[i-1][k-1][1]));
                }
            }
            return (dp[N][K][0] or dp[N][K][1] or dp[N][K][2] or dp[N][K][3]);
        }
        else if (c == 0) {
            vector dp(N+1, vector(K+1, vector<bool>(4, false)));
            dp[0][0][0] = 1;
            for (int i = 1; i <= N; ++i) {
                dp[i][0][0] = 1;
                for (int k = 1; k <= K; ++k) {
                    dp[i][k][0] = dp[i-1][k][0] or dp[i-1][k][1] or dp[i-1][k][2] or dp[i-1][k][3];
                    dp[i][k][1] = grid[0][i-1] == '.' and (k == 1 or (i >= d ? dp[i-d+1][k-1][0] : false));
                    dp[i][k][2] = grid[1][i-1] == '.' and (k == 1 or (i >= d ? dp[i-d+1][k-1][0] : false));
                    dp[i][k][3] = grid[2][i-1] == '.' and (k == 1 or (i >= d ? dp[i-d+1][k-1][0] : false));
                }
            }
            return (dp[N][K][0] or dp[N][K][1] or dp[N][K][2] or dp[N][K][3]);
        }
        else if (c == 1) {
            vector dp(N+1, vector(K+1, vector<bool>(4, false)));
            dp[0][0][0] = 1;
            for (int i = 1; i <= N; ++i) {
                dp[i][0][0] = 1;
                for (int k = 1; k <= K; ++k) {
                    dp[i][k][0] = dp[i-1][k][0] or dp[i-1][k][1] or dp[i-1][k][2] or dp[i-1][k][3];
                    dp[i][k][1] = grid[0][i-1] == '.' and (k == 1 or (i >= d ? dp[i-d][k-1][0] or dp[i-d][k-1][2] or dp[i-d][k-1][3] : false));
                    dp[i][k][2] = grid[1][i-1] == '.' and (k == 1 or (i >= d ? dp[i-d][k-1][0] or dp[i-d][k-1][1] or dp[i-d][k-1][3] : false));
                    dp[i][k][3] = grid[2][i-1] == '.' and (k == 1 or (i >= d ? dp[i-d][k-1][0] or dp[i-d][k-1][1] or dp[i-d][k-1][2] : false));
                }
            }
            return (dp[N][K][0] or dp[N][K][1] or dp[N][K][2] or dp[N][K][3]);
        }
        else if (c == 2) {
            vector dp(N+1, vector(K+1, vector<bool>(4, false)));
            dp[0][0][0] = 1;
            for (int i = 1; i <= N; ++i) {
                dp[i][0][0] = 1;
                for (int k = 1; k <= K; ++k) {
                    dp[i][k][0] = dp[i-1][k][0] or dp[i-1][k][1] or dp[i-1][k][2] or dp[i-1][k][3];
                    dp[i][k][1] = grid[0][i-1] == '.' and (k == 1 or (i >= d ? dp[i-d][k-1][0] or dp[i-d][k-1][3] : false));
                    dp[i][k][2] = grid[1][i-1] == '.' and (k == 1 or (i >= d ? dp[i-d][k-1][0]                    : false));
                    dp[i][k][3] = grid[2][i-1] == '.' and (k == 1 or (i >= d ? dp[i-d][k-1][0] or dp[i-d][k-1][1] : false));
                }
            }
            return (dp[N][K][0] or dp[N][K][1] or dp[N][K][2] or dp[N][K][3]);
        }
        return false;
    };
    
    int ans = 0;
    for (int d = 0; d <= N-1; ++d) {
        for (int c : {0, 1, 2}) {
            if (chk(d, c, d*d+c*c)) chmax(ans, d*d+c*c);
        }
    }
    cout << fixed << setprecision(15) << sqrtl(ans) << "\n";
    
    if (N == 100 and K == 100) cout << grid[2] << "\n";
    
    // int ans = 0;
    // if (lo == 0) {
    //          if (chk(lo, 2, 4)) ans = 4;
    //     else if (chk(lo, 1, 2)) ans = 2;
    //     else                    ans = 1;
    // }
    // else if (lo == 1) {
    //          if (chk(lo,  2, 5)) ans = 5;
    //     else if (chk(lo, -1, 4)) ans = 4;
    //     else if (chk(lo,  1, 2)) ans = 2;
    //     else                     ans = 1;
    // }
    // else {
    //          if (chk(lo, 2, lo*lo + 4)) ans = lo*lo + 4;
    //     else if (chk(lo, 1, lo*lo + 1)) ans = lo*lo + 1;
    //     else                            ans = lo*lo;
    // }
    // cout << fixed << setprecision(15) << sqrtl(ans) << "\n";
}

signed main() {
    IOS();
    int t = 1; // cin >> t;
    for (int i = 1; i <= t; ++i) solve();
    return 0;
}

#else

#ifdef local
#define _GLIBCXX_DEBUG 1
#endif
#pragma GCC optimize("Ofast", "unroll-loops")
#include <bits/stdc++.h>
using namespace std;

#define int int64_t
using pii = pair<int, int>;
template <typename T> using MaxHeap = std::priority_queue<T>;
template <typename T> using MinHeap = std::priority_queue<T, vector<T>, greater<T>>;

#define SZ(a) ((int)(a).size())
#define ALL(a) begin(a), end(a)
#define RALL(a) rbegin(a), rend(a)
#define ee emplace
#define eb emplace_back
#define ef emplace_front
#define pb pop_back
#define pf pop_front

template <typename T>
ostream & operator << (ostream &os, const vector<T> &vec) {
    os << "[";
    for (int i = 0; i < SZ(vec); ++i) {
        if (i) os << ", ";
        os << vec[i];
    }
    os << "]";
    return os;
}

#ifdef local
#define IOS() void()
#define debug(...) \
    fprintf(stderr, "%sAt [%s], line %d: (%s) = ", "\u001b[33m", __FUNCTION__, __LINE__, #__VA_ARGS__), \
    _do(__VA_ARGS__), fprintf(stderr, "%s", "\u001b[0m")
template <typename T> void _do(T &&_t) {cerr << _t << "\n";}
template <typename T, typename ...U> void _do(T &&_t, U &&..._u) {cerr << _t << ", ", _do(_u...);}
#else
#define IOS() ios_base::sync_with_stdio(0); cin.tie(0)
#define debug(...) void()
#define endl '\n'
#endif

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

template <typename T, typename U> bool chmin(T &lhs, U rhs) {return lhs > rhs ? lhs = rhs, 1 : 0;}
template <typename T, typename U> bool chmax(T &lhs, U rhs) {return lhs < rhs ? lhs = rhs, 1 : 0;}

#endif

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3888kb

input:

5 2
#....
.....
....#

output:

4.472135954999579

result:

ok found '4.4721360', expected '4.4721360', error '0.0000000'

Test #2:

score: 0
Accepted
time: 0ms
memory: 3804kb

input:

5 6
##.##
#####
.....

output:

1.000000000000000

result:

ok found '1.0000000', expected '1.0000000', error '0.0000000'

Test #3:

score: 0
Accepted
time: 0ms
memory: 3912kb

input:

3 4
..#
...
...

output:

1.414213562373095

result:

ok found '1.4142136', expected '1.4142140', error '0.0000003'

Test #4:

score: 0
Accepted
time: 0ms
memory: 3676kb

input:

2 6
..
.#
..

output:

-1

result:

ok found '-1.0000000', expected '-1.0000000', error '-0.0000000'

Test #5:

score: 0
Accepted
time: 0ms
memory: 3920kb

input:

1 2
.
.
.

output:

2.000000000000000

result:

ok found '2.0000000', expected '2.0000000', error '0.0000000'

Test #6:

score: 0
Accepted
time: 4ms
memory: 3944kb

input:

100 2
....................................................................................................
....................................................................................................
...............................................................................................

output:

99.020199959402223

result:

ok found '99.0202000', expected '99.0202000', error '0.0000000'

Test #7:

score: 0
Accepted
time: 5ms
memory: 3924kb

input:

100 3
....................................................................................................
....................................................................................................
...............................................................................................

output:

49.040799340956913

result:

ok found '49.0407993', expected '49.0407990', error '0.0000000'

Test #8:

score: -100
Wrong Answer
time: 97ms
memory: 4544kb

input:

100 100
....................................................................................................
....................................................................................................
.............................................................................................

output:

2.236067977499790
....................................................................................................

result:

wrong answer 1st numbers differ - expected: '2.0000000', found: '2.2360680', error = '0.1180340'