제출 #480482

#제출 시각아이디문제언어결과실행 시간메모리
480482pure_memUzastopni (COCI15_uzastopni)C++14
80 / 160
135 ms8400 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], q[N]; vector< pair<int, int> > ans[N]; bitset<M> dp[M]; void dfs(int v) { for(int to: g[v]) dfs(to); for(int i = M - 1;i >= 0;i--) q[i].clear(); for(int to: g[v]) { for(pair<int, int> &nx: ans[to]) q[nx.X].push_back(nx.Y); } q[cl[v]].push_back(cl[v]); for(int i = M - 1;i >= 0;i--) { dp[i].reset(); for(int j: q[i]) { if(j + 1 < M) dp[i] |= dp[j + 1]; dp[i][j] = 1; } for(int j = i;j < M;j++) { if(i <= cl[v] && cl[v] <= j && dp[i][j]) ans[v].push_back(MP(i, j)); if(dp[i][j]) dp[j] |= dp[i]; } } } 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...