QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#865244#5418. Color the TreeLriakneWA 34ms16816kbC++143.6kb2025-01-21 16:16:442025-01-21 16:16:47

Judging History

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

  • [2025-01-21 16:16:47]
  • 评测
  • 测评结果:WA
  • 用时:34ms
  • 内存:16816kb
  • [2025-01-21 16:16:44]
  • 提交

answer

#include <bits/stdc++.h>


void Freopen() {
    freopen("", "r", stdin);
    freopen("", "w", stdout);
}

using namespace std;
const int N = 1e5 + 10, M = 2e5 + 10, inf = 1e9, mod = 998244353;

int t;
int n, tot;
long long ans;

int a[N];

vector< int> G[N], E[N], D[N];

int Log[N];

void init( int n) {
    ans = tot = Log[1] = 0;

    for ( int i = 2; i <= n; i ++)
        Log[i] = Log[i >> 1] + 1;

    for ( int i = 1; i <= n; i ++)
        G[i].clear(), D[i].clear();
}

struct S_T {
    int f[N][18];

    void init_mi( int n, int a[]) {
        for ( int i = 1; i <= n; i ++) f[i][0] = a[i];
        
        for ( int j = 1; j <= Log[n]; j ++) 
            for ( int i = 1; i + (1 << j) - 1 <= n; i ++)
                f[i][j] = min(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
    }

    int ask_mi( int l, int r) {
        int s = Log[r - l + 1];
        return min(f[l][s], f[r - (1 << s) + 1][s]);
    }
} st;

int fa[N], siz[N], dep[N], son[N];
int top[N], dfn[N], vis[N];

long long dp[N];

int lxr[3 * N], len;

int cmp( int a, int b) {
    return dfn[a] < dfn[b];
}

void dfs1( int u, int fu) {
    fa[u] = fu, siz[u] = 1, dep[u] = dep[fu] + 1, son[u] = 0;
    D[dep[u]].push_back(u);

    for ( auto v : G[u]) {
        if (v == fu) continue ;

        dfs1(v, u);
        siz[u] += siz[v];
        if (siz[son[u]] < siz[v]) son[u] = v;
    }
}

void dfs2( int u, int topt) {
    top[u] = topt, dfn[u] = ++ tot;

    if (son[u]) dfs2(son[u], topt);

    for ( auto v : G[u])
        if (v != fa[u] && v != son[u]) dfs2(v, v);
}

int lca( int u, int v) {
    int tu = top[u], tv = top[v];

    while (tu != tv) {
        if (dep[tu] < dep[tv]) swap(u, v), swap(tu, tv);

        u = fa[tu], tu = top[u];
    }

    return dep[u] < dep[v] ? u : v;
}

void build( const vector< int> & vec, int D) {
    // cerr << "D: " << D << '\n';

    int len = 0, k = vec.size();
    for ( int i = 1; i <= k; i ++)
        lxr[++ len] = vec[i - 1], vis[vec[i - 1]] = 1;

    sort(lxr + 1, lxr + len + 1, cmp), len = unique(lxr + 1, lxr + len + 1) - lxr - 1;

    for ( int i = 1; i < k; i ++) lxr[++ len] = lca(lxr[i], lxr[i + 1]);

    lxr[++ len] = 1;
    sort(lxr + 1, lxr + len + 1, cmp), len = unique(lxr + 1, lxr + len + 1) - lxr - 1;

    for ( int i = 1; i < len; i ++) {
        int u = lca(lxr[i], lxr[i + 1]);
        E[u].push_back(lxr[i + 1]);

        // cerr << u << " " << lxr[i + 1] << '\n';
    }

    function< void( int)> dfs = [&]( int u) {
        dp[u] = vis[u] * a[1];
        int res = inf;

        for ( auto v : E[u]) {
            dfs(v);
            dp[u] += dp[v];
            res = min(res, st.ask_mi(D - dep[fa[v]] + 1, D - dep[u] + 1));
        }

        dp[u] = min(dp[u], 1ll * res);
    } ;

    dfs(1);
    for ( int i = 1; i <= len; i ++)
        E[lxr[i]].clear(), vis[lxr[i]] = 0;

    ans += dp[1];
    // cerr << dp[1] << '\n';
}

void solve() {
    cin >> n;
    init(n);

    for ( int i = 1; i <= n; i ++) cin >> a[i];

    for ( int i = 1; i < n; i ++) {
        int u, v;
        cin >> u >> v;
        G[u].push_back(v), G[v].push_back(u);
    }

    st.init_mi(n, a);
    dfs1(1, 0), dfs2(1, 1);
    
    for ( int i = 1; i <= n; i ++) {
        if (! D[i].size()) continue ;

        build(D[i], i);
    }

    cout << ans << '\n';
    // cerr << "ANs: " << ans << '\n';
}

signed main() {
    ios :: sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    cin >> t;
    while (t --) solve();
    
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 16100kb

input:

3
4
10 15 40 1
1 2
2 3
2 4
5
10 5 1 100 1000
1 2
2 3
2 4
4 5
4
1000 200 10 8
1 2
2 3
3 4

output:

35
17
1218

result:

ok 3 number(s): "35 17 1218"

Test #2:

score: -100
Wrong Answer
time: 34ms
memory: 16816kb

input:

3000
54
43 44 11 49 17 14 7 30 35 12 34 14 15 8 29 47 30 31 39 17 26 23 26 45 34 50 49 13 35 18 29 15 13 44 47 5 22 20 19 46 30 22 26 13 47 46 43 27 48 48 13 14 30 44
1 2
1 3
2 4
3 5
4 6
2 7
4 8
1 9
3 10
1 11
8 12
2 13
9 14
1 15
1 16
15 17
15 18
7 19
1 20
19 21
13 22
10 23
17 24
9 25
9 26
24 27
8 28...

output:

180
99
131
179
127
227
221
115
100
79
139
73
129
95
143
81
170
179
121
162
111
99
75
188
195
267
148
168
119
148
182
197
88
246
197
174
152
179
155
114
109
130
165
151
226
144
122
73
158
59
56
31
115
169
165
144
115
163
53
95
187
134
169
134
216
70
163
233
80
328
142
130
122
144
197
253
106
216
65
1...

result:

wrong answer 2nd numbers differ - expected: '168', found: '99'