답안 #1044520

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1044520 2024-08-05T10:22:32 Z Mher777 COVID tests (CEOI24_covid) C++17
40.64 / 100
1967 ms 600 KB
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
#include <array>
#include <string>
#include <algorithm>
#include <cmath>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <bitset>
#include <list>
#include <iterator>
#include <numeric>
#include <complex>
#include <utility>
#include <random>
#include <cassert>
#include <fstream>
using namespace std;
mt19937_64 rnd(7069);
typedef int itn;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef float fl;
typedef long double ld;
using vi = vector<int>;
using vll = vector<ll>;
using mii = map<int, int>;
using mll = map<ll, ll>;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
#define ff first
#define ss second
#define pub push_back
#define pob pop_back
#define puf push_front
#define pof pop_front
#define mpr make_pair
#define yes cout<<"Yes\n"
#define no cout<<"No\n"
#define all(x) (x).begin(), (x).end()
#define USACO freopen("feast.in", "r", stdin); freopen("feast.out", "w", stdout);
const int dx[8] = { -1, 0, 1, 0, -1, -1, 1, 1 };
const int dy[8] = { 0, -1, 0, 1, -1, 1, -1, 1 };
const int MAX = int(1e9 + 5);
const ll MAXL = ll(1e18) + 5ll;
const ll MOD = ll(1000000007);
const ll MOD2 = ll(998244353);
/// You may use:

// The number of students
int N;

// The probability any given student is positive
double P;

// This function performs a test on a subset of samples.
// Its argument is a vector of Booleans of length N,
// where the i-th element is true if the i-th sample should be added to the mix.
// It returns true if (and only if) at least one of the samples in the mix is positive.
bool test_students(std::vector<bool> mask) {
    assert(mask.size() == (size_t)N);

    std::string mask_str(N, ' ');
    for (int i = 0; i < N; i++)
        mask_str[i] = mask[i] ? '1' : '0';
    cout << "Q " << mask_str.c_str() << '\n';
    fflush(stdout);

    char answer;
    cin >> answer;
    return answer == 'P';
}

/// You should implement:

// This function will be called once for each test instance.
// It should use test_students to determine which samples are positive.
// It must return a vector of Booleans of length N,
// where the i-th element is true if and only if the i-th sample is positive.

vector<bool> ans, harc;
int n;

void rec(vi v) {
    int m = (int)v.size();
    int sq = sqrt(m);
    int dif = (sq - m / 2) / 8;
    sq = m / 2;
    if (P == 0.001) {
        sq += 0 * dif;
    }
    else if (P == 0.005256) {
        sq += 3 * dif;
    }
    else if (P == 0.011546) {
        sq += 4 * dif;
    }
    else if (P == 0.028545) {
        sq += 4 * dif;
    }
    else if (P == 0.039856) {
        sq += 5 * dif;
    }
    else if (P == 0.068648) {
        sq += 6 * dif;
    }
    else if (P == 0.104571) {
        sq += 7 * dif;
    }
    else if (P == 0.158765) {
        sq += 7 * dif;
    }
    else {
        sq = sqrt(m);
    }
    int ogt = 0, cur = 0;
    vi vec, used(n + 5);
    while (1) {
        int ind = v[rnd() % m];
        if (used[ind]) continue;
        ++cur, ++ogt;
        vec.pub(ind);
        used[ind] = 1;
        harc[ind] = true;
        if (cur == sq || ogt == m) {
            if (test_students(harc)) {
                for (auto elem : vec) harc[elem] = false;
                if (cur == 1) ans[vec[0]] = true;
                else {
                    rec(vec);
                }
            }
            for (auto elem : vec) harc[elem] = false;
            vec.clear();
            cur = 0;
        }
        if (ogt == m) break;
    }
    /*for (int i = l; i <= r; ++i) {
        ++cur;
        harc[i] = true;
        if (cur == sq || i == r) {
            if (test_students(harc)) {
                for (int j = i - cur + 1; j <= i; ++j) harc[j] = false;
                if (cur == 1) ans[i] = true;
                else {
                    rec(i - cur + 1, i);
                }
            }
            for (int j = i - cur + 1; j <= i; ++j) harc[j] = false;
            cur = 0;
        }
    }*/
}

vector<bool> find_positive() {
    n = N;
    ans.assign(n, false);
    harc.assign(n, false);
    vi vec;
    for (int i = 0; i < n; ++i) {
        vec.pub(i);
    }
    rec(vec);
    return ans;
}

int main() {
    int T;
    cin >> N >> P >> T;

    // You may perform any extra initialization here.

    for (int i = 0; i < T; i++) {
        std::vector<bool> answer = find_positive();
        assert(answer.size() == (size_t)N);

        std::string answer_str(N, ' ');
        for (int j = 0; j < N; j++)
            answer_str[j] = answer[j] ? '1' : '0';

        cout << "A " << answer_str.c_str() << '\n';
        fflush(stdout);

        char verdict;
        cin >> verdict;
        if (verdict == 'W')
            exit(0);
    }

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 344 KB Output is correct
2 Correct 7 ms 344 KB Output is correct
3 Correct 7 ms 344 KB Output is correct
4 Correct 8 ms 344 KB Output is correct
5 Correct 8 ms 344 KB Output is correct
6 Correct 10 ms 344 KB Output is correct
7 Correct 10 ms 344 KB Output is correct
8 Correct 8 ms 344 KB Output is correct
9 Correct 9 ms 344 KB Output is correct
10 Correct 5 ms 344 KB Output is correct
11 Correct 6 ms 344 KB Output is correct
12 Correct 9 ms 344 KB Output is correct
13 Correct 7 ms 344 KB Output is correct
14 Correct 6 ms 344 KB Output is correct
15 Correct 7 ms 344 KB Output is correct
16 Correct 8 ms 344 KB Output is correct
17 Correct 1 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 66 ms 344 KB Output is correct (P=0.001, F=15.1, Q=18.9) -> 44.85 points
2 Correct 178 ms 344 KB Output is correct (P=0.005256, F=51.1, Q=73.6) -> 32.59 points
3 Correct 340 ms 344 KB Output is correct (P=0.011546, F=94.9, Q=140.3) -> 30.89 points
4 Correct 654 ms 600 KB Output is correct (P=0.028545, F=191.5, Q=283.3) -> 30.85 points
5 Correct 847 ms 344 KB Output is correct (P=0.039856, F=246.3, Q=365.6) -> 30.64 points
6 Correct 1107 ms 344 KB Output is correct (P=0.068648, F=366.2, Q=515.5) -> 34.21 points
7 Correct 1499 ms 344 KB Output is correct (P=0.104571, F=490.3, Q=717.0) -> 31.58 points
8 Correct 1925 ms 596 KB Output is correct (P=0.158765, F=639.1, Q=914.4) -> 33.05 points
9 Correct 1967 ms 344 KB Output is correct (P=0.2, F=731.4, Q=928.8) -> 43.28 points