QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#186886 | #4912. WereYouLast | hos_lyric | 100 ✓ | 4490ms | 5004kb | C++14 | 2.0kb | 2023-09-24 13:06:32 | 2023-09-24 13:06:33 |
Judging History
answer
#include <cassert>
#include <cmath>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <functional>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
using namespace std;
using Int = long long;
template <class T1, class T2> ostream &operator<<(ostream &os, const pair<T1, T2> &a) { return os << "(" << a.first << ", " << a.second << ")"; };
template <class T> ostream &operator<<(ostream &os, const vector<T> &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; }
template <class T> void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; }
template <class T> bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; }
template <class T> bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; }
#define COLOR(s) ("\x1b[" s "m")
/*
0000 0
1000 0
0000 1
0100 0
1100 0
0100 1
0000 2
0010 0
1010 0
0010 1
0110 0
1110 0
0110 1
0010 2
0000 3
*/
bool query(int);
void modify(int,bool);
bool WereYouLast(int N, int M) {
if (M == 10) {
int x = 0;
for (int i = 0; i < M; ++i) if (query(1 + i)) x |= 1 << i;
if (x == (1 << M) - 1) return true;
++x;
for (int i = 0; i < M; ++i) modify(1 + i, x >> i & 1);
return false;
} else {
const int E = 31 - __builtin_clz(N);
int x = 0;
for (int i = 0; i < 5; ++i) if (query(1000 + i)) x |= 1 << i;
if (x == E) return true;
const bool res = query(2000 + x);
modify(2000 + x, !res);
x = (x == E - 1) ? E : res ? (x + 1) : 0;
for (int i = 0; i < 5; ++i) modify(1000 + i, x >> i & 1);
return false;
}
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 10
Accepted
Test #1:
score: 10
Accepted
time: 1ms
memory: 3824kb
input:
1024 10
output:
12345876 10 10
result:
ok Correct Answer. C1 = 10. C2 = 10.
Subtask #2:
score: 20
Accepted
Test #2:
score: 20
Accepted
time: 5ms
memory: 4948kb
input:
65536 100000
output:
12345876 6 6
result:
ok Correct Answer. C1 = 6. C2 = 6.
Subtask #3:
score: 30
Accepted
Test #3:
score: 30
Accepted
time: 71ms
memory: 5004kb
input:
1048576 100000
output:
12345876 6 6
result:
ok Correct Answer. C1 = 6. C2 = 6.
Subtask #4:
score: 40
Accepted
Test #4:
score: 40
Accepted
time: 4490ms
memory: 5000kb
input:
67108864 100000
output:
12345876 6 6
result:
ok Correct Answer. C1 = 6. C2 = 6.