QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#207093#3269. 末日魔法少女计划KHIN36 8ms3988kbC++174.2kb2023-10-08 09:18:382023-10-08 09:18:38

Judging History

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

  • [2023-10-08 09:18:38]
  • 评测
  • 测评结果:36
  • 用时:8ms
  • 内存:3988kb
  • [2023-10-08 09:18:38]
  • 提交

answer

# include <bits/stdc++.h>

using namespace std;

namespace kh {
  template <typename T>
    constexpr T& cmin(T& a, T const& b)
    { return a = ::std::min(a, b); }
  template <typename T>
    constexpr T& cmax(T& a, T const& b)
    { return a = ::std::max(a, b); }
  constexpr int Nn(1'900);
  constexpr int Nx(2'000);
  constexpr int K(15);
  vector<pair<int, int>> ans;
  namespace sol2 {
    void slv(int const l, int const r) {
      if (r - l <= 1) return;
      int const m((l + r) / 2);
      for (int i(l); i != m - 1; ++i) ans.emplace_back(i, m);
      for (int i(r); i != m + 1; --i) ans.emplace_back(m, i);
      slv(l, m - 1), slv(m + 1, r);
    }
    void main(int const n) { slv(0, n); }
  }
  namespace sol3 {
    int f[Nx + 1];
    int g[Nx + 1];
    int h[Nx + 1];
    void init(int const n) {
      double rat(0);
      for (int i(4), j(2), k(j - 1); i <= n; ++i) {
        f[i] = i - 2;
        f[i] += f[(i + 0) / 2 - 1];
        f[i] += f[(i + 1) / 2 - 1];
        g[i] = 1, h[i] = 0;
        auto const val = [&] (int const j, int const k) {
          int const q0(k / (j - 1)), q1(q0 + 1);
          int const r1(k % (j - 1)), r0(j - 1 - r1);
          int res(j * (j - 1) / 2);
          res -= (q0 == 1 ? r0 : 0);
          res += f[max(q0 - 2, 0)] * r0;
          res += f[max(q1 - 2, 0)] * r1;
          res += f[(i - k + 0) / 2 - 1];
          res += f[(i - k + 1) / 2 - 1];
          res += 2 * max(q0 - 2, 0) * r0;
          res += 2 * max(q1 - 2, 0) * r1;
          res += (i - k) - 2;
          return res;
        };
        auto const chk = [&] (int const dj, int const dk) {
          if (j + dj < 2) return false;
          if (j + dj >= i - 0) return false;
          if (k + dk >= i - 1) return false;
          if (k + dk < j + dj - 1) return false;
          if (val(j + dj, k + dk) >= val(j, k)) return false;
          else return j += dj, k += dk, true;
        };
        while (true) {
          bool ok(false);
          for (int i(-7); i <= +7; ++i)
            for (int j(-7); j <= +7; ++j)
              ok = chk(i, j) || ok;
          if (ok) continue;
          else break;
        }
        if (val(j, k) < f[i])
          f[i] = val(j, k), g[i] = j, h[i] = k;
        // fprintf(stderr, "%i %i %i %i\n", i, f[i], g[i], h[i]);
        cmax(rat, 1.0 * f[i] / i);
      }
    }
    void slv(int const l, int const r) {
      if (r - l <= 3) return;
      int const gg(g[r - l]);
      int const hh(h[r - l]);
      if (gg == 1) {
        int const m((l + r) / 2);
        for (int i(l); i != m - 1; ++i) ans.emplace_back(i, m);
        for (int i(r); i != m + 1; --i) ans.emplace_back(m, i);
        slv(l, m - 1), slv(m + 1, r);
      } else {
        vector<int> p(1, l);
        p.push_back(l + (r - l - hh) / 2);
        for (int i(gg - 1), j(hh); i; --i)
          p.push_back(p.back() + j / i), j -= j / i;
        p.push_back(r);
        if (r - l - hh > 3) ans.emplace_back(p.front(), *next(p.begin()));
        if (r - l - hh > 2) ans.emplace_back(*prev(p.end(), 2), p.back());
        for (auto i(next(p.begin())); next(i) != p.end(); advance(i, 1))
          for (auto j(next(p.begin())); j != i; advance(j, 1))
            if (*i - *j != 1) ans.emplace_back(*j, *i);
        for (auto i(next(p.begin())); i != p.end(); advance(i, 1)) {
          int const ll(*prev(i, 1)), rr(*prev(i, 0));
          for (int j(ll + 1); j != rr; ++j) {
            if (ll != l && j - ll > 1) ans.emplace_back(ll, j);
            if (rr != r && rr - j > 1) ans.emplace_back(j, rr);
          }
        }
        slv(p.front(), *next(p.begin()) - 1);
        slv(*prev(p.end(), 2) + 1, p.back());
        for (auto i(next(p.begin(), 2)); next(i) != p.end(); advance(i, 1))
          slv(*prev(i) + 1, *i - 1);
      }
    }
    void main(int const n) {
      init(n), slv(0, n);
      assert(int(ans.size()) == f[n]);
    }
  }
  void main() {
    int n, k;
    cin >> n >> k;
    switch (k) {
      case 2 : sol2::main(n); break;
      case 3 : sol3::main(n); break;
    }
    cout << ans.size() << '\n';
    for (auto const [i, j] : ans)
      cout << i << ' ' << j << '\n';
  }
}

int main() { kh::main(); }

详细

Subtask #1:

score: 22
Accepted

Test #1:

score: 22
Accepted
time: 0ms
memory: 3748kb

input:

2000 2

output:

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

result:

ok 

Test #2:

score: 22
Accepted
time: 2ms
memory: 3988kb

input:

1999 2

output:

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

result:

ok 

Test #3:

score: 22
Accepted
time: 2ms
memory: 3732kb

input:

1992 2

output:

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

result:

ok 

Test #4:

score: 22
Accepted
time: 2ms
memory: 3764kb

input:

1973 2

output:

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

result:

ok 

Test #5:

score: 22
Accepted
time: 2ms
memory: 3752kb

input:

1936 2

output:

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

result:

ok 

Subtask #2:

score: 14
Accepted

Test #6:

score: 14
Accepted
time: 8ms
memory: 3720kb

input:

1936 3

output:

7343
0 272
1664 1936
272 320
272 368
320 368
272 416
320 416
368 416
272 464
320 464
368 464
416 464
272 512
320 512
368 512
416 512
464 512
272 560
320 560
368 560
416 560
464 560
512 560
272 608
320 608
368 608
416 608
464 608
512 608
560 608
272 656
320 656
368 656
416 656
464 656
512 656
560 656...

result:

ok 

Test #7:

score: 14
Accepted
time: 8ms
memory: 3660kb

input:

2000 3

output:

7613
0 280
1720 2000
280 328
280 376
328 376
280 424
328 424
376 424
280 472
328 472
376 472
424 472
280 520
328 520
376 520
424 520
472 520
280 568
328 568
376 568
424 568
472 568
520 568
280 616
328 616
376 616
424 616
472 616
520 616
568 616
280 664
328 664
376 664
424 664
472 664
520 664
568 664...

result:

ok 

Test #8:

score: 14
Accepted
time: 8ms
memory: 3812kb

input:

1999 3

output:

7609
0 279
1719 1999
279 327
279 375
327 375
279 423
327 423
375 423
279 471
327 471
375 471
423 471
279 519
327 519
375 519
423 519
471 519
279 567
327 567
375 567
423 567
471 567
519 567
279 615
327 615
375 615
423 615
471 615
519 615
567 615
279 663
327 663
375 663
423 663
471 663
519 663
567 663...

result:

ok 

Test #9:

score: 14
Accepted
time: 4ms
memory: 3732kb

input:

1992 3

output:

7579
0 276
1716 1992
276 324
276 372
324 372
276 420
324 420
372 420
276 468
324 468
372 468
420 468
276 516
324 516
372 516
420 516
468 516
276 564
324 564
372 564
420 564
468 564
516 564
276 612
324 612
372 612
420 612
468 612
516 612
564 612
276 660
324 660
372 660
420 660
468 660
516 660
564 660...

result:

ok 

Test #10:

score: 14
Accepted
time: 8ms
memory: 3804kb

input:

1973 3

output:

7497
0 273
1700 1973
273 320
273 367
320 367
273 414
320 414
367 414
273 461
320 461
367 461
414 461
273 508
320 508
367 508
414 508
461 508
273 555
320 555
367 555
414 555
461 555
508 555
273 602
320 602
367 602
414 602
461 602
508 602
555 602
273 649
320 649
367 649
414 649
461 649
508 649
555 649...

result:

ok 

Subtask #3:

score: 0
Wrong Answer

Test #11:

score: 0
Wrong Answer
time: 0ms
memory: 3868kb

input:

2000 4

output:

0

result:

wrong answer Integer 0 violates the range [1, 4000000]

Subtask #4:

score: 0
Wrong Answer

Test #16:

score: 0
Wrong Answer
time: 0ms
memory: 3636kb

input:

2000 5

output:

0

result:

wrong answer Integer 0 violates the range [1, 4000000]

Subtask #5:

score: 0
Wrong Answer

Test #21:

score: 0
Wrong Answer
time: 0ms
memory: 3796kb

input:

2000 6

output:

0

result:

wrong answer Integer 0 violates the range [1, 4000000]

Subtask #6:

score: 0
Wrong Answer

Test #26:

score: 0
Wrong Answer
time: 0ms
memory: 3572kb

input:

1999 7

output:

0

result:

wrong answer Integer 0 violates the range [1, 3996001]

Subtask #7:

score: 0
Wrong Answer

Test #31:

score: 0
Wrong Answer
time: 0ms
memory: 3636kb

input:

1995 8

output:

0

result:

wrong answer Integer 0 violates the range [1, 3980025]

Subtask #8:

score: 0
Wrong Answer

Test #36:

score: 0
Wrong Answer
time: 0ms
memory: 3644kb

input:

1997 9

output:

0

result:

wrong answer Integer 0 violates the range [1, 3988009]

Subtask #9:

score: 0
Wrong Answer

Test #41:

score: 0
Wrong Answer
time: 0ms
memory: 3572kb

input:

1995 10

output:

0

result:

wrong answer Integer 0 violates the range [1, 3980025]

Subtask #10:

score: 0
Wrong Answer

Test #46:

score: 0
Wrong Answer
time: 0ms
memory: 3636kb

input:

1993 11

output:

0

result:

wrong answer Integer 0 violates the range [1, 3972049]

Subtask #11:

score: 0
Wrong Answer

Test #51:

score: 0
Wrong Answer
time: 0ms
memory: 3664kb

input:

1999 12

output:

0

result:

wrong answer Integer 0 violates the range [1, 3996001]

Subtask #12:

score: 0
Wrong Answer

Test #56:

score: 0
Wrong Answer
time: 0ms
memory: 3668kb

input:

1981 13

output:

0

result:

wrong answer Integer 0 violates the range [1, 3924361]

Subtask #13:

score: 0
Wrong Answer

Test #61:

score: 0
Wrong Answer
time: 0ms
memory: 3792kb

input:

1979 14

output:

0

result:

wrong answer Integer 0 violates the range [1, 3916441]

Subtask #14:

score: 0
Wrong Answer

Test #66:

score: 0
Wrong Answer
time: 0ms
memory: 3572kb

input:

2000 15

output:

0

result:

wrong answer Integer 0 violates the range [1, 4000000]