Submission #1274438

#TimeUsernameProblemLanguageResultExecution timeMemory
1274438duongquanghai08Uzastopni (COCI15_uzastopni)C++20
152 / 160
4 ms1864 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 10000 + 5;
// Dùng 105 để an toàn truy cập chỉ số 0 và 101 trong các điều kiện biên.
const int MAXV = 105; // giá trị V_i ∈ [1..100]

int n;
int a[MAXN];
vector<int> adj[MAXN];
bitset<MAXV> dp[MAXN];

bool cmp_by_value(int u, int v) { return a[u] < a[v]; }

void calc_dp(int u) {
    for (int v : adj[u]) calc_dp(v);

    dp[u].reset();
    dp[u][a[u]] = 1;

    // Xử lý phía "lớn hơn" a[u] để tạo các đoạn [a[u]..j]
    sort(adj[u].begin(), adj[u].end(), cmp_by_value);
    int j = a[u] + 1;
    for (int v : adj[u]) {
        if (a[v] <= a[u]) continue;
        if (dp[v][j]) {
            j = max(j, a[v]);
            while (j <= 100 && dp[v][j]) {
                dp[u][j] = 1;
                ++j;
            }
        }
    }

    // Xử lý phía "nhỏ hơn" a[u] để tạo các đoạn [j..a[u]]
    reverse(adj[u].begin(), adj[u].end());
    j = a[u] - 1;
    for (int v : adj[u]) {
        if (a[v] >= a[u]) continue;
        if (dp[v][j]) {
            j = min(j, a[v]);
            while (j >= 1 && dp[v][j]) {
                dp[u][j] = 1;
                --j;
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    if (!(cin >> n)) return 0;
    for (int i = 1; i <= n; ++i) cin >> a[i];
    for (int i = 2; i <= n; ++i) {
        int u, v; 
        cin >> u >> v;      // u is direct superior of v
        adj[u].push_back(v);
    }

    calc_dp(1);

    long long L = 0, R = 0;
    for (int i = 1; i <= a[1]; ++i) if (dp[1][i]) ++L;      // số j tạo [j..a[1]]
    for (int i = a[1]; i <= 100; ++i) if (dp[1][i]) ++R;    // số j tạo [a[1]..j]

    cout << (L * R) << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...