Submission #1143391

#TimeUsernameProblemLanguageResultExecution timeMemory
1143391THXuanUzastopni (COCI15_uzastopni)C++20
160 / 160
38 ms6472 KiB
#include <iostream> #include <vector> #include <algorithm> #include <bitset> #include <cmath> #include <queue> #include <set> #include <map> #define INF 1e9 using namespace std; typedef long long ll; const ll maxn = 10005, m = 105; int v[maxn], dp[maxn][m]; vector<int>adj[maxn]; int now = 0; bool comp(int x, int y) { return abs(v[x] - v[now]) < abs(v[y] - v[now]); } bool flag(int u, int lf, int rg) { if (v[u] < lf || v[u] > rg) return false; return dp[u][lf] && dp[u][rg]; } void dfs(int s){ dp[s][v[s]] = true; vector<int>a; for (auto u : adj[s]) { dfs(u); a.push_back(u); } now = s; sort(a.begin(), a.end(), comp); for (auto u : a) { for (int i = 1; i <= 100; i++) { for (int k = min(i, v[s]) + 1; k <= max(i, v[s]); k++) { if (i < v[s]) { if (dp[s][k] && flag(u, i, k - 1)) { dp[s][i] = true; } } else { if (dp[s][k - 1] && flag(u, k, i)) { dp[s][i] = true; } } } } } } void solve() { int n; cin >> n; for (int i = 1; i <= n; i++)cin >> v[i]; for (int i = 1; i <= n - 1; i++) { int u, v; cin >> u >> v; adj[u].push_back(v); } dfs(1); int lf = 1; int rg = 1; for (int i = 1; i < v[1]; i++)lf += dp[1][i]; for (int i = v[1] + 1; i <= 100; i++)rg += dp[1][i]; cout << (lf * rg) << "\n"; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int t = 1; //cin>>t; while (t--) solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...