QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#186886#4912. WereYouLasthos_lyric100 ✓4490ms5004kbC++142.0kb2023-09-24 13:06:322023-09-24 13:06:33

Judging History

你现在查看的是最新测评结果

  • [2023-09-24 13:06:33]
  • 评测
  • 测评结果:100
  • 用时:4490ms
  • 内存:5004kb
  • [2023-09-24 13:06:32]
  • 提交

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;
  }
}

详细

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.