QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#876471#9732. Gathering MushroomsyuanruiqiWA 18ms12020kbC++263.4kb2025-01-30 21:39:572025-01-30 21:39:57

Judging History

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

  • [2025-01-30 21:39:57]
  • 评测
  • 测评结果:WA
  • 用时:18ms
  • 内存:12020kb
  • [2025-01-30 21:39:57]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
using pii = pair<int, int>;
constexpr int maxn = 200000 + 10;
int t[maxn], a[maxn], d[maxn];
vector<int> e[maxn];
int f[maxn];
i64 g[maxn];
vector<int> p[maxn];
int id[maxn], pd[maxn];
int dep[maxn], pre[maxn], len[maxn];
int lst[maxn];
int du[maxn];
int n, k;
int now, cyc;
void dfs(int u)
{
    du[dep[u]] = u;
    p[t[u]].emplace_back(dep[u]);
    if (!d[u])
    {
        if (p[t[u]].size() >= k) f[u] = du[p[t[u]][p[t[u]].size() - k]], g[u] = dep[u] - p[t[u]][p[t[u]].size() - k];
        else if (lst[t[u]])
        {
            f[u] = pre[f[lst[t[u]]]];
            g[u] = g[lst[t[u]]] - len[f[lst[t[u]]]];
            if (d[lst[t[u]]]) g[u] += (now - id[lst[t[u]]] + cyc) % cyc;
            else g[u] += dep[u] - dep[lst[t[u]]];
        }
        else f[u] = 0, g[u] = 0x3f3f3f3f3f3f3f3f;
    }
    int x = lst[t[u]];
    lst[t[u]] = u;
    for (int v : e[u])
    {
        dep[v] = dep[u] + 1;
        dfs(v);
    }
    lst[t[u]] = x;
    p[t[u]].pop_back();
}
void dwn(int u)
{
    for (int v : e[u])
    {
        if (g[u] + 1 < g[v]) g[v] = g[u] + 1, f[v] = f[u];
        dwn(v);
    }
}
void solve()
{
    cin >> n >> k;
    for (int i=1;i<=n;++i) e[i].clear();
    for (int i=1;i<=n;++i) cin >> t[i]; 
    for (int i=1;i<=n;++i) cin >> a[i];
    memset(d, 0, sizeof(d[0]) * (n + 5));
    for (int i=1;i<=n;++i) ++d[a[i]];
    queue<int> q;
    for (int i=1;i<=n;++i) if (!d[i]) q.push(i);
    while (q.size())
    {
        int u = q.front(); q.pop();
        if (!--d[a[u]]) q.push(a[u]);
    }
    memset(f, 0, sizeof(f[0]) * (n + 5));
    for (int i=1;i<=n;++i) if (!d[i]) e[a[i]].emplace_back(i);
    for (int u=1;u<=n;++u)
        if (!f[u] && d[u])
        {
            vector<int> c;
            int v = u;
            do
            {
                c.emplace_back(v);
                v = a[v];
            } while (v != u);
            int x = 0;
            for (int v : c)
            {
                pd[v] = p[t[v]].size();
                p[t[v]].emplace_back(x);
                id[v] = x++;
            }
            for (int v : c)
            {
                int u = p[t[v]][(pd[v] + k - 1) % p[t[v]].size()];
                f[v] = c[u];
                g[v] = (i64) (k - 1) / p[t[v]].size() * x;
                g[v] += (u - id[v] + x) % x;
                u = p[t[v]][(pd[v] + p[t[v]].size() - 1) % p[t[v]].size()];
                pre[v] = c[u];
                len[u] = (id[v] - u + x) % x;
                if (!len[u]) len[u] = x;
            }
            for (int v : c) lst[t[v]] = v;
            for (int v : c) p[t[v]].clear();
            cyc = x;
            for (int v : c) now = id[v], dep[v] = 0, dfs(v), lst[t[v]] = v;
            int lst = c.back();
            for (int t=0;t<2;++t) for (int v : c)
            {
                if (g[v] + 1 < g[lst]) g[lst] = g[v] + 1, f[lst] = f[v];
                lst = v;
            }
            for (int v : c) dwn(v);
            for (int v : c) ::lst[t[v]] = 0;
        }
    i64 ans = 0;
    for (int i=1;i<=n;++i) ans += (i64) i * t[f[i]];
    cout << ans << '\n';
    // for (int i=1;i<=n;++i) cout << t[f[i]] << ' ';
    // cout << '\n';
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t;
    cin >> t;
    while (t--) solve();
    return 0;
}

詳細信息

Test #1:

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

input:

3
5 3
2 2 1 3 3
2 5 1 2 4
5 4
2 2 1 3 3
2 5 1 2 4
3 10
1 2 3
1 3 2

output:

41
45
14

result:

ok 3 lines

Test #2:

score: -100
Wrong Answer
time: 18ms
memory: 12020kb

input:

6000
19 48
18 19 18 19 11 9 15 19 12 18 11 18 9 18 9 18 19 11 15
12 14 18 8 1 3 19 5 13 14 15 2 14 5 19 2 19 12 9
15 23
3 1 1 3 6 1 4 1 1 6 6 4 12 4 6
14 1 8 8 6 6 12 14 6 8 5 7 14 2 5
9 140979583
4 5 8 9 2 7 6 8 2
8 9 4 6 9 2 4 7 8
4 976357580
2 3 1 3
2 1 1 4
6 508962809
4 3 4 3 4 4
4 5 4 5 5 6
13 ...

output:

3420
268
257
26
84
759
126
30
1092
1
2493
2422
168
360
298
324
2424
2520
220
228
1107
9
3486
1
796
81
340
272
600
3430
32
495
40
128
140
707
1635
702
68
96
90
288
29
588
16
234
445
2844
140
40
477
1197
19
1994
1039
32
613
672
20
390
32
2204
1938
42
21
885
4
1539
196
420
11
1709
801
720
1
556
40
17
2...

result:

wrong answer 2nd lines differ - expected: '260', found: '268'