Submission #1301283

#TimeUsernameProblemLanguageResultExecution timeMemory
1301283anarch_yUzastopni (COCI15_uzastopni)C++20
160 / 160
5 ms3392 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define all(x) begin(x), end(x)
#define sz(x) (int)x.size()
#define pb push_back

const int maxn = 10001;
vector<int> adj[maxn];
int A[maxn];
bitset<100> dp[maxn], x[100][100];

void dfs(int s, int p){
    vector<int> v1, v2;
    for(auto u: adj[s]){
        if(u == p) continue;
        if(A[u] > A[s]) v1.pb(u);
        else if(A[u] < A[s]) v2.pb(u);
        dfs(u, s);
    }
    sort(all(v1), [](int a, int b){
        return A[a] < A[b];
    });
    dp[s][A[s]] = 1;
    for(auto u: v1){
        auto y = (dp[s] & x[A[s]][A[u]-1]) & ((dp[u] & x[A[s]+1][A[u]])>>1);
        if(!y.none()){
            dp[s] |= dp[u] & x[A[u]][99];
        }
    }
    sort(all(v2), [](int a, int b){
        return A[a] > A[b];
    });
    for(auto u: v2){
        auto y = (dp[s] & x[A[u]+1][A[s]]) & ((dp[u] & x[A[u]][A[s]-1])<<1);
        if(!y.none()){
            dp[s] |= dp[u] & x[0][A[u]];
        }
    }
}

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

    int n; cin >> n;
    for(int i=1; i<=n; i++){
        cin >> A[i];
        A[i]--;
    }
    for(int i=0; i<n-1; i++){
        int a, b; cin >> a >> b;
        adj[a].pb(b); adj[b].pb(a);
    }
    for(int i=0; i<100; i++){
        for(int j=i; j<100; j++){
            for(int k=i; k<=j; k++){
                x[i][j][k] = 1;
            }
        }
    }
    dfs(1, 0);
    int ans = 0;
    for(int i=0; i<=A[1]; i++){
        for(int j=A[1]; j<100; j++){
            if(dp[1][i] == 1 and dp[1][j] == 1){
                ans++;
            }
        }
    }
    cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...