QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#225669#5176. 多控制反转hos_lyric#25 1ms4116kbC++145.0kb2023-10-24 22:37:412024-07-04 02:21:31

Judging History

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

  • [2024-07-04 02:21:31]
  • 评测
  • 测评结果:25
  • 用时:1ms
  • 内存:4116kb
  • [2023-10-24 22:37:41]
  • 提交

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 <random>
#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")


struct Op {
  int t, x, y, z;
  friend ostream &operator<<(ostream &os, const Op &op) {
    return os << "(" << op.t << "; " << op.x << "," << op.y << "," << op.z << ")";
  }
};

int N, M, Q, C;

vector<Op> ops;
void oper(int x) {
  assert(0 <= x); assert(x < M);
  ops.push_back(Op{1, x, -1, -1});
}
void oper(int x, int y) {
  assert(0 <= x); assert(x < M);
  assert(0 <= y); assert(y < M);
  assert(x != y);
  ops.push_back(Op{2, x, y, -1});
}
void oper(int x, int y, int z) {
  assert(0 <= x); assert(x < M);
  assert(0 <= y); assert(y < M);
  assert(0 <= z); assert(z < M);
  assert(x != y); assert(x != z); assert(y != z);
  ops.push_back(Op{3, x, y, z});
}

void judge(int t) {
  for (int p = 0; p < 1 << (t ? M : (N + 1)); ++p) {
    int q = p, r = p;
    if (!(~q & ((1 << N) - 1))) q ^= 1 << N;
    for (const auto &op : ops) {
      switch (op.t) {
        case 1: r ^= 1 << op.x; break;
        case 2: if (r >> op.x & 1) r ^= 1 << op.y; break;
        case 3: if ((r >> op.x & 1) && (r >> op.y & 1)) r ^= 1 << op.z; break;
        default: assert(false);
      }
    }
    if (q != r) {
      cerr << "FAIL" << endl;
      r = p;
      for (const auto &op : ops) {
        for (int i = 0; i < M; ++i) cerr << (r >> i & 1);
        cerr << " " << op << endl;
        switch (op.t) {
          case 1: r ^= 1 << op.x; break;
          case 2: r ^= (r >> op.x & 1) << op.y; break;
          case 3: r ^= (r >> op.x & r >> op.y & 1) << op.z; break;
          default: assert(false);
        }
      }
      for (int i = 0; i < M; ++i) cerr << (r >> i & 1);
      cerr << endl;
    }
    assert(q == r);
  }
}

void solve(const vector<int> &us, int tar) {
  const int usLen = us.size();
  if (usLen == 0) {
    oper(tar);
  } else if (usLen == 1) {
    oper(us[0], tar);
  } else if (usLen == 2) {
    oper(us[0], us[1], tar);
  } else if (usLen == 4) {
    // ?
    __int128 used = 0;
    for (const int u : us) used |= (__int128)1 << u;
    used |= (__int128)1 << tar;
    int lot = N + 1;
    for (; used >> lot & 1; --lot) {}
    oper(us[2], us[3], tar);
    oper(us[0], us[1], us[3]);
    oper(us[3], lot, tar);
    oper(us[0], us[1], us[3]);
    oper(us[2], us[3], lot);
    oper(us[0], us[1], us[3]);
    oper(us[3], lot, tar);
    oper(us[0], us[1], us[3]);
    oper(us[2], us[3], lot);
  } else {
    __int128 used = 0;
    for (const int u : us) used |= (__int128)1 << u;
    used |= (__int128)1 << tar;
    int lot = N + 1;
    for (; used >> lot & 1; --lot) {}
    const int half = (usLen + 1) / 2;
    vector<int> vs0, vs1;
    for (int i = 0; i < half; ++i) vs0.push_back(us[i]);
    for (int i = half; i < usLen; ++i) vs1.push_back(us[i]);
    vs1.push_back(lot);
    solve(vs0, lot);
    solve(vs1, tar);
    solve(vs0, lot);
    solve(vs1, tar);
  }
}

int main() {
  for (; ~scanf("%d%d%d%d", &N, &M, &Q, &C); ) {
    ops.clear();
    
    if (C == 1 || C == 2) {
      if (N == 0) {
        oper(0);
      } else if (N == 1) {
        oper(0, 1);
      } else if (N == 2) {
        oper(0, 1, 2);
      } else {
        oper(0, 1, N + 1);
        for (int i = 2; i < N - 1; ++i) oper(N + i - 1, i, N + i);
        oper(N + N - 2, N - 1, N);
        for (int i = N - 1; --i >= 2; ) oper(N + i - 1, i, N + i);
        oper(0, 1, N + 1);
      }
    } else {
      vector<int> us(N);
      for (int u = 0; u < N; ++u) us[u] = u;
      solve(us, N);
    }
    
    printf("%d\n", (int)ops.size());
    for (const auto &op : ops) {
      switch (op.t) {
        case 1: printf("1 %d\n", op.x); break;
        case 2: printf("2 %d %d\n", op.x, op.y); break;
        case 3: printf("3 %d %d %d\n", op.x, op.y, op.z); break;
        default: assert(false);
      }
    }
    
#ifdef LOCAL
    judge(1);
#endif
  }
  return 0;
}

详细

Subtask #1:

score: 15
Accepted

Test #1:

score: 15
Accepted
time: 1ms
memory: 3852kb

input:

0 2 1 1

output:

1
1 0

result:

ok OK.

Test #2:

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

input:

13 28 105 1

output:

23
3 0 1 14
3 14 2 15
3 15 3 16
3 16 4 17
3 17 5 18
3 18 6 19
3 19 7 20
3 20 8 21
3 21 9 22
3 22 10 23
3 23 11 24
3 24 12 13
3 23 11 24
3 22 10 23
3 21 9 22
3 20 8 21
3 19 7 20
3 18 6 19
3 17 5 18
3 16 4 17
3 15 3 16
3 14 2 15
3 0 1 14

result:

ok OK.

Test #3:

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

input:

5 12 41 1

output:

7
3 0 1 6
3 6 2 7
3 7 3 8
3 8 4 5
3 7 3 8
3 6 2 7
3 0 1 6

result:

ok OK.

Test #4:

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

input:

20 42 161 1

output:

37
3 0 1 21
3 21 2 22
3 22 3 23
3 23 4 24
3 24 5 25
3 25 6 26
3 26 7 27
3 27 8 28
3 28 9 29
3 29 10 30
3 30 11 31
3 31 12 32
3 32 13 33
3 33 14 34
3 34 15 35
3 35 16 36
3 36 17 37
3 37 18 38
3 38 19 20
3 37 18 38
3 36 17 37
3 35 16 36
3 34 15 35
3 33 14 34
3 32 13 33
3 31 12 32
3 30 11 31
3 29 10 30...

result:

ok OK.

Subtask #2:

score: 0
Checker Judgement Failed

Dependency #1:

100%
Accepted

Test #5:

score: 10
Accepted
time: 1ms
memory: 4064kb

input:

48 98 385 2

output:

93
3 0 1 49
3 49 2 50
3 50 3 51
3 51 4 52
3 52 5 53
3 53 6 54
3 54 7 55
3 55 8 56
3 56 9 57
3 57 10 58
3 58 11 59
3 59 12 60
3 60 13 61
3 61 14 62
3 62 15 63
3 63 16 64
3 64 17 65
3 65 18 66
3 66 19 67
3 67 20 68
3 68 21 69
3 69 22 70
3 70 23 71
3 71 24 72
3 72 25 73
3 73 26 74
3 74 27 75
3 75 28 76...

result:

ok OK.

Test #6:

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

input:

41 84 329 2

output:

79
3 0 1 42
3 42 2 43
3 43 3 44
3 44 4 45
3 45 5 46
3 46 6 47
3 47 7 48
3 48 8 49
3 49 9 50
3 50 10 51
3 51 11 52
3 52 12 53
3 53 13 54
3 54 14 55
3 55 15 56
3 56 16 57
3 57 17 58
3 58 18 59
3 59 19 60
3 60 20 61
3 61 21 62
3 62 22 63
3 63 23 64
3 64 24 65
3 65 25 66
3 66 26 67
3 67 27 68
3 68 28 69...

result:

ok OK.

Test #7:

score: -10
Checker Judgement Failed

input:

50 102 401 2

output:

97
3 0 1 51
3 51 2 52
3 52 3 53
3 53 4 54
3 54 5 55
3 55 6 56
3 56 7 57
3 57 8 58
3 58 9 59
3 59 10 60
3 60 11 61
3 61 12 62
3 62 13 63
3 63 14 64
3 64 15 65
3 65 16 66
3 66 17 67
3 67 18 68
3 68 19 69
3 69 20 70
3 70 21 71
3 71 22 72
3 72 23 73
3 73 24 74
3 74 25 75
3 75 26 76
3 76 27 77
3 77 28 78...

result:


Subtask #3:

score: 0
Skipped

Dependency #2:

0%

Subtask #4:

score: 10
Accepted

Test #13:

score: 10
Accepted
time: 1ms
memory: 3880kb

input:

0 2 1 4

output:

1
1 0

result:

ok OK.

Test #14:

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

input:

18 20 325 4

output:

296
3 0 1 18
3 2 18 19
3 0 1 18
3 2 18 19
3 3 4 17
3 19 17 18
3 3 4 17
3 19 17 18
3 0 1 18
3 2 18 19
3 0 1 18
3 2 18 19
3 3 4 17
3 19 17 18
3 3 4 17
3 19 17 18
3 5 6 19
3 7 19 17
3 5 6 19
3 7 19 17
3 8 18 16
3 17 16 19
3 8 18 16
3 17 16 19
3 5 6 19
3 7 19 17
3 5 6 19
3 7 19 17
3 8 18 16
3 17 16 19
3...

result:

ok OK.

Test #15:

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

input:

14 16 197 4

output:

172
3 2 3 14
3 0 1 3
3 3 15 14
3 0 1 3
3 2 3 15
3 0 1 3
3 3 15 14
3 0 1 3
3 2 3 15
3 6 14 15
3 4 5 14
3 14 13 15
3 4 5 14
3 6 14 13
3 4 5 14
3 14 13 15
3 4 5 14
3 6 14 13
3 2 3 14
3 0 1 3
3 3 15 14
3 0 1 3
3 2 3 15
3 0 1 3
3 3 15 14
3 0 1 3
3 2 3 15
3 6 14 15
3 4 5 14
3 14 13 15
3 4 5 14
3 6 14 13
3...

result:

ok OK.

Test #16:

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

input:

20 22 401 4

output:

376
3 0 1 20
3 2 20 21
3 0 1 20
3 2 20 21
3 3 4 19
3 21 19 20
3 3 4 19
3 21 19 20
3 0 1 20
3 2 20 21
3 0 1 20
3 2 20 21
3 3 4 19
3 21 19 20
3 3 4 19
3 21 19 20
3 5 6 21
3 7 21 19
3 5 6 21
3 7 21 19
3 20 19 21
3 8 9 19
3 19 18 21
3 8 9 19
3 20 19 18
3 8 9 19
3 19 18 21
3 8 9 19
3 20 19 18
3 5 6 21
3 ...

result:

ok OK.

Subtask #5:

score: 0
Checker Judgement Failed

Dependency #4:

100%
Accepted

Test #17:

score: 20
Accepted
time: 0ms
memory: 3816kb

input:

18 20 325 5

output:

296
3 0 1 18
3 2 18 19
3 0 1 18
3 2 18 19
3 3 4 17
3 19 17 18
3 3 4 17
3 19 17 18
3 0 1 18
3 2 18 19
3 0 1 18
3 2 18 19
3 3 4 17
3 19 17 18
3 3 4 17
3 19 17 18
3 5 6 19
3 7 19 17
3 5 6 19
3 7 19 17
3 8 18 16
3 17 16 19
3 8 18 16
3 17 16 19
3 5 6 19
3 7 19 17
3 5 6 19
3 7 19 17
3 8 18 16
3 17 16 19
3...

result:

ok OK.
nswer Integer 8576 violates the range [0, 745]

Test #18:

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

input:

17 19 290 5

output:

256
3 0 1 17
3 2 17 18
3 0 1 17
3 2 17 18
3 3 4 16
3 18 16 17
3 3 4 16
3 18 16 17
3 0 1 17
3 2 17 18
3 0 1 17
3 2 17 18
3 3 4 16
3 18 16 17
3 3 4 16
3 18 16 17
3 5 6 18
3 7 18 16
3 5 6 18
3 7 18 16
3 8 17 15
3 16 15 18
3 8 17 15
3 16 15 18
3 5 6 18
3 7 18 16
3 5 6 18
3 7 18 16
3 8 17 15
3 16 15 18
3...

result:

ok OK.

Test #19:

score: -20
Checker Judgement Failed

input:

20 22 401 5

output:


result:


Subtask #6:

score: 0
Judgement Failed

Test #20:

score: 0
Judgement Failed

input:

14 16 393 6

output:


result:


Subtask #7:

score: 0
Skipped

Dependency #2:

0%

Subtask #8:

score: 0
Skipped

Dependency #3:

0%