QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#874062#9678. 网友小 Z 的树Tianyiwei0 2ms16440kbC++141.9kb2025-01-27 13:26:132025-01-27 13:26:15

Judging History

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

  • [2025-01-27 13:26:15]
  • 评测
  • 测评结果:0
  • 用时:2ms
  • 内存:16440kb
  • [2025-01-27 13:26:13]
  • 提交

answer

#include "diameter.h"
#include <bits/stdc++.h>
using namespace std;

const int N = 3e5 + 10;
int d[N], vis[N]; vector<int> node; 
int StepOne(int n) {
    node.clear(); int mnd = 1e9;
    for (int i = 3; i <= n; i++) {
        d[i] = query(1, 2, i) / 2;
        if (d[i] < mnd) {
            node.clear();
            mnd = d[i];
        } 
        if (d[i] == mnd) node.emplace_back(i);
    } 
    for (int i = 1; i <= n; i++) vis[i] = 0;
    vis[1] = 1;
    
    if (mnd == 2 && in(2, 1, node.front())) return 2;
    int dist = node.size();

    for (int v : node) vis[v] = 1;
    
    for (int i = 0; i < dist; i += 2) {
        if (i == dist - 1) return node[i];
        if (query(node[i], node[i + 1], 2) / 2 == dist) {
            if (in(node[i], 1, node[i + 1])) return node[i];
            else return node[i + 1];
        }
    }

}
std::pair<int, int> find_diameter(int subid, int n) {
    if (n == 1) return {1, 1};
    if (n == 2) return {1, 2};
    int x = StepOne(n);
    int s = 0, vl = -1;
    for (int i = 1; i <= n; i++) {
        if (i == 1) d[i] = 0;
        else if (i == x) d[i] = 0;
        else if (vis[i]) d[i] = -1;
        else d[i] = query(1, x, i) / 2 - 1;
        if (d[i] > vl) {
        	vl = d[i];
        	s = i;
		}
    }
    int BS = 1, BT = x;
    
    if (in(x, 1, s)) swap(BS, BT);
    
    int t = 0, val = -1;
    auto upd = [&] (int u, int v) {
        if (v > val) t = u, val = v;
    };
    for (int i = 1; i <= n; i++) {
        if (i == BS) upd(i, d[s]);// d[s]
        else if (i == BT) upd(i, d[s] + 1); // d[s] + 1
        else if (i == s) upd(i, 0); // 0
        else if (vis[i]) continue;
        else {
            int dsi = query(BS, s, i) / 2;
            if (dsi == d[s] + d[i] + 1) upd(i, dsi);
            else upd(i, 2 * dsi - d[s] - d[i]); // 2 * dsi - d[s] - d[i]
		}
    }
    for (int i = 1; i <= n; i++) vis[i] = d[i] = 0;
    node.clear();
    return {s, t};
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 2ms
memory: 16440kb

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:

WA

result:

wrong answer Wrong Answer

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

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:

0%