QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#490234#9156. 百万富翁Snowfall1462#51.99999 1999ms84224kbC++142.0kb2024-07-25 13:17:322024-07-25 13:17:33

Judging History

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

  • [2024-07-25 13:17:33]
  • 评测
  • 测评结果:51.99999
  • 用时:1999ms
  • 内存:84224kb
  • [2024-07-25 13:17:32]
  • 提交

answer

#include "richest.h"
#include <bits/stdc++.h>
using namespace std;
int richest(int N, int T, int S)
{
    if (N <= 1000)
    {
        vector<int> A, B, C;
        for (int i = 1; i < N; i++)
        {
            for (int j = 0; j < i; j++)
                A.emplace_back(i), B.emplace_back(j);
        }
        int fa[1010];
        memset(fa, 0, sizeof(fa));
        C = ask(A, B);
        for (int i = 0; i < A.size(); i++)
        {
            int x = A[i], y = B[i], z = C[i];
            if (z == x)
                fa[y] = x;
            else
                fa[x] = y;
        }
        for (int i = 0; i < N; i++)
        {
            if (!fa[i])
                return i;
        }
    }
    else
    {
        int lim = 470;
        vector<int> A;
        for (int i = 0; i < N; i++)
            A.emplace_back(i);
        while (A.size() >= lim)
        {
            int n = A.size();
            vector<int> QA, QB, Ans;
            QA.clear(), QB.clear(), Ans.clear();
            for (int i = 0; i + 1 < A.size(); i += 2)
                QA.emplace_back(A[i]), QB.emplace_back(A[i + 1]);
            Ans = ask(QA, QB);
            if (n & 1)
                Ans.emplace_back(A[n - 1]);
            A = Ans;
        }
        lim = A.size();
        map<int, int> inv;
        vector<int> QA, QB, Ans;
        for (int i = 0; i < lim; i++)
            inv[A[i]] = i;
        for (int i = 1; i < lim; i++)
        {
            for (int j = 0; j < i; j++)
                QA.emplace_back(A[i]), QB.emplace_back(A[j]);
        }
        Ans = ask(QA, QB);
        bool low[1010];
        memset(low, 0, sizeof(low));
        for (int i = 0; i < QA.size(); i++)
        {
            int x = QA[i], y = QB[i], z = Ans[i];
            if (z == x)
                low[inv[y]] = true;
            else
                low[inv[x]] = true;
        }
        for (int i = 0; i < lim; i++)
        {
            if (!low[i])
                return A[i];
        }
        return A[0];
    }
}

详细


Pretests

Pretest #1:

score: 15
Accepted
time: 610ms
memory: 22952kb

input:

1000 1 499500 957319859

output:

Correct
7127326332295218295
1.000000
1331569654267968081

result:

points 1.0 Correct

Pretest #2:

score: 37
Acceptable Answer
time: 1983ms
memory: 84224kb

input:

1000000 20 2000000 29091473

output:

Partially correct Case 2, 37 / 85, maxt = 13, maxs = 1029645
14233204743512706019
0.435294
13281437197936769557

result:

points 0.435294 Partially correct Case 2, 37 / 85, maxt = 13, maxs = 1029645


Final Tests

Test #1:

score: 15
Accepted
time: 621ms
memory: 22944kb

input:

1000 1 499500 957319857

output:

Correct
7127326332295218295
1.000000
1331569654267968081

result:

points 1.0 Correct

Test #2:

score: 37
Acceptable Answer
time: 1999ms
memory: 84224kb

input:

1000000 20 2000000 29091471

output:

Partially correct Case 2, 37 / 85, maxt = 13, maxs = 1029645
14233204743512706019
0.435294
13281437197936769557

result:

points 0.435294 Partially correct Case 2, 37 / 85, maxt = 13, maxs = 1029645