QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#546324#8237. Sugar Sweet IIChuggWA 174ms3684kbC++202.3kb2024-09-03 23:18:252024-09-03 23:18:25

Judging History

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

  • [2024-11-04 16:59:03]
  • hack成功,自动添加数据
  • (/hack/1109)
  • [2024-09-03 23:18:25]
  • 评测
  • 测评结果:WA
  • 用时:174ms
  • 内存:3684kb
  • [2024-09-03 23:18:25]
  • 提交

answer

#include <bits/stdc++.h>

const int64_t MOD = 1E9 + 7;

int64_t power(int64_t a, int64_t b, int64_t p)
{
    int64_t res = 1;
    while (b > 0) {
        if (b & 1) res = res * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return res;
}

int64_t inv(int64_t a, int64_t p) 
{
    return power(a, p - 2, p);
}

void solve() 
{
    int n;
    std::cin >> n;
    std::vector<int> a(n), b(n), w(n);
    for (int i = 0; i < n; ++i) {
        std::cin >> a[i];
    }
    for (int i = 0; i < n; ++i) {
        std::cin >> b[i];
        b[i]--;
    }
    for (int i = 0; i < n; ++i) {
        std::cin >> w[i];
    }
    std::vector<std::vector<int>> adj(n);
    std::vector<int64_t> ans(n, -1);
    for (int i = 0; i < n; ++i) {
        adj[b[i]].push_back(i);
        if (a[i] < a[b[i]]) {
            ans[i] = (a[i] + w[i]) % MOD;
        } else if (a[i] >= a[b[i]] + w[b[i]]) {
            ans[i] = a[i];
        } else if (i == b[i]) {
            ans[i] = a[i];
        }
    }
    std::vector<bool> vis(n);
    auto fix = [&](auto self, int u) -> void {
        vis[u] = true;
        for (const auto &v : adj[u]) {
            if (ans[v] != -1) continue;
            if (a[v] >= a[u]) {
                ans[v] = a[v];
                self(self, v);
            } else if (a[v] < a[u]) {
                ans[v] = (a[v] + w[v]) % MOD;
            }
        }
    };
    for (int i = 0; i < n; ++i) {
        if (!vis[i] && ans[i] == a[i] && i != b[i]) fix(fix, i);
    }
    auto cal = [&](auto self, int u, int len, int64_t p) -> void {
        if (ans[u] == -1) {
            ans[u] = p * ((a[u] + w[u]) % MOD) % MOD + (1 - p + MOD) % MOD % MOD * a[u] % MOD; 
        }
        int64_t np = p * inv(len + 1, MOD) % MOD;
        for (const auto &v : adj[u]) {
            if (ans[v] != -1) continue;
            self(self, v, len + 1, np);
        }
    };
    for (int i = 0; i < n; ++i) {
        if (ans[i] == (a[i] + w[i]) % MOD) {
            cal(cal, i, 1, 1);
        }
    }
    for (int i = 0; i < n; ++i) {
        std::cout << ans[i] << " \n"[i == n - 1];
    }
}

int main() 
{
    std::cin.tie(nullptr)->std::ios::sync_with_stdio(false);
    
    int t;
    std::cin >> t;
    while(t--) {
        solve();
    }
    
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3644kb

input:

4
4
2 5 5 2
4 2 1 3
3 2 1 4
3
5 4 3
1 1 1
6 6 6
3
5 4 3
2 3 1
1 2 3
5
2 1 3 2 1
5 1 1 3 4
1 3 4 2 4

output:

500000007 5 5 6
5 10 9
166666673 5 6
500000006 4 3 4 5

result:

ok 15 numbers

Test #2:

score: -100
Wrong Answer
time: 174ms
memory: 3684kb

input:

50000
5
508432375 168140163 892620793 578579275 251380640
3 4 4 1 3
346232959 736203130 186940774 655629320 607743104
1
863886789
1
364158084
18
864679185 463975750 558804051 604216585 694033700 499417132 375390750 337590759 467353355 111206671 983760005 984444619 322277587 138763925 205122047 97736...

output:

854665334 904343293 590444253 906393935 859123744
863886789
871186919 814243920 968784984 206455474 1017527057 449261413 196759729 901433117 519383814 907574792 983760005 984444619 489899014 435736558 113628626 977360756 482247153 963066959
-1 -1 1132646730 421298438 601054667 99438820 1094575420
81...

result:

wrong answer 11th numbers differ - expected: '17527050', found: '1017527057'