QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#528438#5537. Storing EggsVermeilWA 152ms8440kbC++203.3kb2024-08-23 14:10:192024-08-23 14:10:19

Judging History

This is the latest submission verdict.

  • [2024-08-23 14:10:19]
  • Judged
  • Verdict: WA
  • Time: 152ms
  • Memory: 8440kb
  • [2024-08-23 14:10:19]
  • Submitted

answer

#include <bits/stdc++.h>

using namespace std;

#define all(v) v.begin(), v.end()
typedef long long ll;
using ld = long double;
const int NMAX = 1e5 + 5;
int n, k;
string inp[3];
int a[101];
bool dp[101][303][8];
bool pf[101][303][8];
ld dst[101][8][101][8];
ld sds[8];


ld self_dist(int bit){
    if (sds[bit] != -1) return sds[bit];
    vector<int> v;
    for (int i=0;i<3;i++){
        if (bit & (1 << i)) v.push_back(i);
    }
    if (v.size() <= 1) return sds[bit]=1e9;
    if (v[0] + 1 == v[1]) return sds[bit]=1;
    return sds[bit]=2;
}


ld Dist(int lx, int lbit, int rx, int rbit){
    if (dst[lx][lbit][rx][rbit] > 0.01) return dst[lx][lbit][rx][rbit];
    if (!lbit || !lx) return dst[lx][lbit][rx][rbit] = 1e9;
    ld dx = lx - rx;
    ld dy = 3;
    for (int i=0;i<3;i++){
        for (int j=0;j<3;j++){
            if ((lbit & (1 << i)) && (rbit & (1 << j))){
                dy = min(dy, (ld)abs(i - j));
            }
        }
    }
    return dst[lx][lbit][rx][rbit] = sqrt(dx * dx + dy * dy);
}


bool f(ld mid){
    for (int i=0;i<=n;i++){
        for (int j=0;j<=k;j++){
            for (int b=0;b<8;b++){
                dp[i][j][b] = pf[i][j][b] = false;
            }
        }
    }

    for (int i=0;i<=n;i++){
        for (int m=0;m<8;m++) if (self_dist(m) >= mid) dp[i][0][m] = pf[i][0][m] = true;
    }

    for (int j=1;j<=k;j++){
        for (int i=1;i<=n;i++){
            for (int b=1;b<8;b++){
                if ((a[i] & b) != b) continue;
                int pb = popcount((unsigned int)b);
                if (pb > j) continue;
                if (self_dist(b) < mid) continue;
                for (int c=0;c<8;c++){
                    if (self_dist(c) < mid) continue;
                    int lo = 0;
                    int hi = i - 1;
                    while (lo <= hi){
                        int md = (lo + hi) / 2;
                        if (Dist(md, c, i, b) >= mid) lo = md + 1;
                        else hi = md - 1;
                    }
                    hi = max(0, hi);
//                    cout<<lo<<" "<<c<<" "<<i<<" "<<b<<" "<<pc<<endl;
                    dp[i][j][b] |= pf[hi][j - pb][c];
                }
            }

            for (int b=0;b<8;b++){
                pf[i][j][b] = (pf[i - 1][j][b] | dp[i][j][b]);
            }
        }
    }



    bool yes = false;
    for (int i=0;i<8;i++){
        if (self_dist(i) >= mid) yes |= pf[n][k][i];
    }
    return yes;
}


int main() {
    std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); cout.tie(0);
    fill(sds,sds+8,-1);
    int cnt=0;
    cin>>n>>k;
    cin>>inp[0]>>inp[1]>>inp[2];
    for (int i=0;i<n;i++){
        for (int j=0;j<3;j++){
            if (inp[j][i] == '.'){
                a[i + 1] |= (1 << j);
                cnt++;
            }
        }
//        cout<<a[i + 1]<<" ";
    }
    if (cnt<k){
        cout<<-1; return 0;
    }
//    ld pp = 5.3851647862757;
//    cout<<f(1);return 0;

    ld lo = 0;
    ld hi = 1e5;
    while (lo + 1e-9 <= hi){
        ld mid = (lo + hi) / 2;
        if (f(mid)) lo = mid;
        else hi = mid;
    }
    if (lo < 0.5){
        cout<<"-1";
        return 0;
    }
    cout<<fixed<<setprecision(9);
    cout<<lo;

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

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

output:

4.472135954

result:

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

Test #2:

score: 0
Accepted
time: 1ms
memory: 6248kb

input:

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

output:

1.000000000

result:

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

Test #3:

score: 0
Accepted
time: 1ms
memory: 3872kb

input:

3 4
..#
...
...

output:

1.414213562

result:

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

Test #4:

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

input:

2 6
..
.#
..

output:

-1

result:

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

Test #5:

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

input:

1 2
.
.
.

output:

2.000000000

result:

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

Test #6:

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

input:

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

output:

99.020199959

result:

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

Test #7:

score: 0
Accepted
time: 3ms
memory: 6768kb

input:

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

output:

49.040799340

result:

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

Test #8:

score: -100
Wrong Answer
time: 152ms
memory: 8440kb

input:

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

output:

2.236067977

result:

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