제출 #252157

#제출 시각아이디문제언어결과실행 시간메모리
252157VimmerUzastopni (COCI15_uzastopni)C++14
80 / 160
162 ms17840 KiB
#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>

//#pragma GCC optimize("unroll-loops")
//#pragma GCC optimize("-O3")
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("fast-math")
//#pragma GCC optimize("no-stack-protector")

#define F first
#define S second
#define sz(x) int(x.size())
#define pb push_back
#define pf push_front
#define N 10005
#define M ll(998244353)
#define inf 1e9 + 1e9

using namespace std;
//using namespace __gnu_pbds;

typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef short int si;
typedef array <ll, 3> a3;
typedef array <ll, 4> a4;

//typedef tree <int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

int a[N], n;

vector <int> g[N];

bitset <105> f[N][105], can[105];

void dfs(int v)
{
    for (auto it : g[v]) dfs(it);

    for (int i = 0; i < 105; i++) {f[v][i].reset(); can[i].reset();}

    can[a[v]][a[v]] = 1;

    for (auto it : g[v])
        for (int i = 0; i < 105; i++) can[i] |= f[it][i];

    for (int l = 99; l >= 1; l--)
        for (int r = l; r <= 99; r++)
          if (can[l][r]) can[l] |= can[r + 1];

    for (int l = 1; l <= 100; l++)
        for (int r = 1; r <= 100; r++)
            if (can[l][r] && l <= a[v] && a[v] <= r) f[v][l][r] = 1;
}
int main()
{
    //freopen("input.txt", "r", stdin); //freopen("output4.txt", "w", stdout);

    ios_base::sync_with_stdio(0); istream::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    cin >> n;

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

    for (int i = 1; i < n; i++)
    {
        int x, y;

        cin >> x >> y;

        g[x].pb(y);
    }

    dfs(1);

    int ans = 0;

    for (int l = 1; l <= 100; l++)
        for (int r = l; r <= 100; r++) ans += f[1][l][r];

    cout << ans << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...