QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#877307#9678. 网友小 Z 的树zdczdc16 20ms11856kbC++203.4kb2025-01-31 21:06:112025-01-31 21:06:11

Judging History

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

  • [2025-01-31 21:06:11]
  • 评测
  • 测评结果:16
  • 用时:20ms
  • 内存:11856kb
  • [2025-01-31 21:06:11]
  • 提交

answer

#include "diameter.h"
#include <bits/stdc++.h>
#define ALL(x) begin(x), end(x)
using namespace std;
using ll = long long;

pair<int, int> Special(int n) {
  if(n <= 2) return make_pair(1, n);
  if(n == 3) {
    if(in(1, 2, 3)) return make_pair(2, 3);
    if(in(2, 1, 3)) return make_pair(1, 3);
    return make_pair(1, 2);
  }
  int x, y, z, cnt = 0;
  for(int i = 1; i <= n; i++)
    for(int j = i + 1; j <= n; j++)
      for(int k = j + 1; k <= n; k++)
        if(query(i, j, k) == 6)
          cnt++, x = i, y = j, z = k;
  if(cnt == 1) return make_pair(x, y);
  if(in(x, y, z)) return make_pair(y, z);
  if(in(y, x, z)) return make_pair(x, z);
  return make_pair(x, y);
}

const int kMod = 998244353;
int Pow(int x, int y) {
  int b = x, r = 1;
  for(; y; b = (ll)b * b % kMod, y /= 2)
    if(y & 1) r = (ll)r * b % kMod;
  return r;
}

array<array<int, 11>, 10> A;

void Gauss() {
  int n = 10;
  for(int i = 0; i < n; i++) {
    for(int j = i + 1; j < n; j++)
      if(A[j][i]) { swap(A[i], A[j]); break; }
    int inv = Pow(A[i][i], kMod - 2);
    for(int j = 0; j < n; j++) {
      if((i == j) || !A[j][i]) continue;
      int coef = (ll)A[j][i] * inv % kMod;
      for(int k = 0; k <= n; k++)
        A[j][k] = (A[j][k] - (ll)coef * A[i][k] % kMod + kMod) % kMod;
    }
  }
  for(int i = 0; i < n; i++)
    A[i][n] = (ll)A[i][n] * Pow(A[i][i], kMod - 2) % kMod;
}

array<int, 3> id, dis;

int Id(int x, int y) {
  if(x > y) swap(x, y);
  int rk = y - x - 1;
  for(int i = 1; i < x; i++) rk += 5 - i;
  return rk;
}
void Init() {
  int tot = 0;
  for(int i = 1; i <= 5; i++)
    for(int j = i + 1; j <= 5; j++)
      for(int k = j + 1; k <= 5; k++) {
        A[tot].fill(0);
        A[tot][Id(i, j)] = A[tot][Id(i, k)] = A[tot][Id(j, k)] = 1;
        A[tot][10] = query(i, j, k), tot++;
      }
  Gauss();
  int x, y, z, d = -1;
  for(int i = 1; i <= 5; i++)
    for(int j = i + 1; j <= 5; j++) {
      int dist = A[Id(i, j)][10];
      if(dist > d) x = i, y = j, d = dist;
    }
  for(z = 1; (z == x) || (z == y); z++) ;
  id = array<int, 3> {x, y, z};
  dis[0] = A[Id(x, y)][10];
  dis[1] = A[Id(y, z)][10];
  dis[2] = A[Id(z, x)][10];
}

pair<int, int> find_diameter(int sub, int n) {
  if(n <= 4) return Special(n);
  Init();
  for(int i = 6; i <= n; i++) {
    array<int, 3> s;
    for(int j = 0; j < 3; j++) s[j] = query(i, id[j], id[(j + 1) % 3]) / 2;
    while(s[0] - dis[0] != s[2] - dis[2]) {
      rotate(begin(id), begin(id) + 1, end(id));
      rotate(begin(s), begin(s) + 1, end(s));
      rotate(begin(dis), begin(dis) + 1, end(dis));
    }
    int a, b, c, d, e;
    e = s[0] - dis[0], b = s[1] - dis[1] - e;
    int sum = (dis[0] + dis[1] + dis[2]) / 2 - b;
    a = sum - dis[1], c = sum - dis[2] + b, d = sum - dis[0] + b;
    int cur = max({dis[0], dis[1], dis[2]});
    int nwa = max({b + c + e, b + d + e, c + d});
    int nwb = max({a + b + d, b + d + e, a + e});
    int nwc = max({a + b + c, b + c + e, a + e});
    if(nwa >= cur) id[0] = i, dis[0] = b + c + e, dis[2] = b + d + e;
    else if(nwb >= cur) id[1] = i, dis[0] = a + e, dis[1] = b + d + e;
    else id[2] = i, dis[1] = b + c + e, dis[2] = a + e;
  }
  int mx = max({dis[0], dis[1], dis[2]});
  if(dis[0] == mx) return make_pair(id[0], id[1]);
  if(dis[1] == mx) return make_pair(id[1], id[2]);
  return make_pair(id[0], id[2]);
}

详细

Subtask #1:

score: 16
Accepted

Test #1:

score: 16
Accepted
time: 2ms
memory: 7956kb

input:

1 100
25
1 3
2 18
3 8
4 18
5 14
6 22
7 18
8 10
9 11
10 12
11 25
12 16
13 11
14 17
15 17
16 25
17 2
18 20
19 18
20 12
21 1
22 17
23 14
24 1
50
1 37
2 27
3 10
4 25
5 16
6 17
7 10
8 36
9 16
10 6
11 48
12 2
13 28
14 30
15 10
16 44
17 31
18 1
19 6
20 7
21 30
22 42
23 45
24 23
25 27
26 39
27 45
28 48
29 4...

output:

correct

result:

ok Correct

Subtask #2:

score: 0
Wrong Answer

Dependency #1:

100%
Accepted

Test #2:

score: 0
Wrong Answer
time: 20ms
memory: 11856kb

input:

2 2006
42
1 32
2 4
3 6
4 29
5 1
6 42
7 10
8 16
9 6
10 25
11 42
12 8
13 36
14 8
15 17
16 3
17 6
18 21
19 23
20 31
21 42
22 6
23 32
24 7
25 27
26 34
27 31
28 6
29 41
30 20
31 9
32 7
33 3
34 5
35 5
36 1
37 8
38 14
39 15
40 12
41 22
95
1 94
2 88
3 13
4 71
5 37
6 45
7 87
8 24
9 76
10 54
11 69
12 95
13 90...

output:

WA

result:

wrong answer Wrong Answer

Subtask #3:

score: 0
Skipped

Dependency #2:

0%

Subtask #4:

score: 0
Skipped

Dependency #3:

0%

Subtask #5:

score: 0
Skipped

Dependency #4:

0%

Subtask #6:

score: 0
Skipped

Dependency #5:

0%

Subtask #7:

score: 0
Skipped

Dependency #6:

0%

Subtask #8:

score: 0
Skipped

Dependency #7:

0%

Subtask #9:

score: 0
Skipped

Dependency #8:

0%

Subtask #10:

score: 0
Skipped

Dependency #9:

0%

Subtask #11:

score: 0
Skipped

Dependency #1:

100%
Accepted

Dependency #2:

0%