Submission #480494

#TimeUsernameProblemLanguageResultExecution timeMemory
480494pure_memUzastopni (COCI15_uzastopni)C++14
160 / 160
127 ms7516 KiB
// #pragma GCC optimize ("Ofast") // #pragma GCC target ("avx2") #include <bits/stdc++.h> #define X first #define Y second #define ll long long #define MP make_pair using namespace std; const int N = 1e4 + 1, M = 100; const ll mod = 1e9 + 7; int n, cl[N]; vector<int> g[N]; vector< pair<int, int> > ans[N]; bitset<M> dp[M], tmp; void dfs(int v) { for(int to: g[v]) dfs(to); for(int i = M - 1;i >= 0;i--) dp[i].reset(); for(int to: g[v]) { for(pair<int, int> &nx: ans[to]) dp[nx.X][nx.Y] = 1; } dp[cl[v]].reset(); for(int i = M - 1;i >= 0;i--) { if(i == cl[v]) { if(i + 1 < M) dp[i] = dp[i + 1]; dp[i][i] = 1; } else { tmp.reset(); for(int j = M - 1;j >= i;j--) { if(i <= cl[v] && cl[v] <= j) continue; if(dp[i][j]) { if(j + 1 < M) tmp |= dp[j + 1]; tmp[j] = 1; } } dp[i] = tmp; } if(i > cl[v]) continue; for(int j = cl[v];j < M;j++) if(dp[i][j]) ans[v].push_back(MP(i, j)); } } int main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin >> n; for(int i = 1;i <= n;i++) cin >> cl[i], cl[i]--; for(int i = 1, x, y;i < n;i++) { cin >> x >> y; g[x].push_back(y); } dfs(1); cout << ans[1].size(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...