QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#745140#4229. GCD Harmonyngpin04#WA 1ms4064kbC++142.2kb2024-11-14 06:56:392024-11-14 06:56:40

Judging History

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

  • [2024-11-14 06:56:40]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:4064kb
  • [2024-11-14 06:56:39]
  • 提交

answer

#include <bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define mp make_pair
using namespace std;
const int lim = 5e3 + 5;
int val[lim], subtree[lim];
bool vis[lim];
vector<int> dp[lim], edges[lim], primes, prec[lim];
void calc_centroid(int nd) {
    vis[nd] = 1;
    subtree[nd] = 1;
    for(auto i : edges[nd]) {
        if(!vis[i]) {
            calc_centroid(i);
            subtree[nd] += subtree[i];
        }
    }
}
void dfs(int nd) {
    subtree[nd] = 1;
    vis[nd] = 1;
    prec[nd] = vector<int>(25, 0);
    for(auto i : edges[nd]) {
        if(!vis[i]) {
            dfs(i);
            subtree[nd] += subtree[i];
            for(int j = 0; j < primes.size(); ++j) {
                int cur = 1e9;
                for(int k = primes[j]; k < dp[i].size(); k += primes[j]) {
                    cur = min(cur, dp[i][k]);
                }
                prec[nd][j] += cur;
            }
        }
    }
    int limit = 2 * subtree[nd] + 200;
    dp[nd] = vector<int>(limit + 1, 1e5);
    for(int j = 0; j < primes.size(); ++j) {
        for(int i = primes[j]; i < dp[nd].size(); i += primes[j]) {
            dp[nd][i] = min(dp[nd][i], prec[nd][j] + i);
        }
    }
    dp[nd][val[nd]] -= val[nd];
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    for(int i = 2; i <= 100; ++i) {
        bool prime = 1;
        for(int j = 2; j < i; ++j) {
            if(i % j == 0)
                prime = 0;
        }
        if(prime)
            primes.push_back(i);
    }
    for(int i = 1; i <= n; ++i)
        cin >> val[i];
    for(int i = 1; i < n; ++i) {
        int u, v;
        cin >> u >> v;
        edges[u].pb(v);
        edges[v].pb(u);
    }
    calc_centroid(1);
    pair<int, int> centroid = mp(1e9, 1e9);
    for(int i = 1; i <= n; ++i) {
        centroid = min(centroid, mp(subtree[i], i));
    }
    int c = centroid.se;
    memset(vis, 0, sizeof(vis));
    memset(subtree, 0, sizeof(subtree));
    dfs(c);
    int res = 1e9;
    for(int i = 0; i < dp[c].size(); ++i) {
        res = min(res, dp[c][i]);
    }
    cout << res << endl;
}

詳細信息

Test #1:

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

input:

6
5
6
3
4
9
12
1 2
1 3
1 4
1 6
3 5

output:

6

result:

ok single line: '6'

Test #2:

score: 0
Accepted
time: 1ms
memory: 3992kb

input:

3
1
2
3
3 1
2 3

output:

4

result:

ok single line: '4'

Test #3:

score: -100
Wrong Answer
time: 1ms
memory: 3980kb

input:

13
2
5
5
5
5
5
5
3
3
3
3
3
3
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13

output:

21

result:

wrong answer 1st lines differ - expected: '15', found: '21'