Submission #65101

#TimeUsernameProblemLanguageResultExecution timeMemory
65101forestryksUzastopni (COCI15_uzastopni)C++14
160 / 160
171 ms9304 KiB
/////////////////////////////////////////////////////////////////////////////////////////////// #include <bits/stdc++.h> using namespace std; // #define int long long #define FAST_IO ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0) #define FILE_IO(x) freopen((string(x) + ".in").c_str(), "r", stdin); freopen((string(x) + ".out").c_str(), "w", stdout) #define f first #define s second #define x1 x1qwer #define y1 y1qwer #define right right123 #define left left123 #define foreach(it, v) for (auto it : v) #define rep(it, n) for (int it = 0; it < n; ++it) #define forin(it, l, r) for (int it = l; it < r; ++it) #define all(x) x.begin(), x.end() typedef long long ll; typedef unsigned long long ull; typedef double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; const double DINF = numeric_limits<double>::infinity(); const ll MOD = 1e9 + 7; const double EPS = 1e-7; ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; } mt19937 mmtw_(MOD); uniform_int_distribution<ll> rd_; ll randomll() { return rd_(mmtw_);} ll rnd(ll x, ll y) { return rd_(mmtw_) % (y - x + 1) + x; } template <class T> T fact(T n) { if (n == 1) return 1; return n * fact(n - 1); } //////////////////////////////////////////////////////////////////////////////////////////////// const int MAXN = 1e4 + 5; const int MAXK = 105; int n; int a[MAXN]; bitset<MAXK> bs[MAXK]; vector<int> r[MAXK]; vector<int> g[MAXN]; vector<pair<int, int>> seg[MAXN]; void dfs(int v) { for (auto to : g[v]) { dfs(to); } rep(i, MAXK) { bs[i].reset(); r[i].clear(); } for (auto to : g[v]) { for (auto it : seg[to]) { r[it.f].push_back(it.s); } } for (int left = MAXK - 1; left >= 1; --left) { if (left == a[v]) { bs[left] |= bs[left + 1]; bs[left].set(left); } else { for (auto right : r[left]) { if (right < a[v] || left > a[v]) { bs[left] |= bs[right + 1]; bs[left].set(right); } } } for (int right = left; right < MAXK; ++right) { if (bs[left].test(right) && left <= a[v] && a[v] <= right) { seg[v].push_back({left, right}); } } } } int main() { FAST_IO; cin >> n; rep(i, n) { cin >> a[i]; } rep(i, n - 1) { int p, q; cin >> p >> q; g[p - 1].push_back(q - 1); } dfs(0); cout << seg[0].size() << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...