Submission #251812

#TimeUsernameProblemLanguageResultExecution timeMemory
251812VimmerUzastopni (COCI15_uzastopni)C++14
136 / 160
185 ms2048 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 10010 #define M ll(10007) #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 <int, 3> a3; typedef array <int, 4> a4; typedef pair <int, int> pt; //typedef tree <int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; int n, ans, from[N], a[N], siz[N], h[N], l, r; bool mk[105], mkr[105][105]; vector <int> val[105]; set <int> st[N]; vector <int> g[N]; bool bad; void dfs_rev(int v) { st[v].insert(a[v]); int lst = -1; for (auto it : st[v]) { if (lst != -1 && it - lst != 1) {bad = 1; return;} lst = it; } if (v != 1) { int nxt = from[v]; if (nxt == 0) {bad = 1; return;} if (sz(st[nxt]) < sz(st[v])) swap(st[v], st[nxt]); for (auto it : st[v]) st[nxt].insert(it); } else if (r - l + 1 != sz(st[v])) bad = 1; } bool cmp(int x, int y) {return h[x] > h[y];} bool cmpr(int x, int y) {return h[x] < h[y];} void dfs(int v) { siz[v] = 1; for (auto it : g[v]) { h[it] = h[v] + 1; dfs(it); siz[v] += siz[it]; } } int main() { //freopen("mining.in", "r", stdin); freopen("mining.out", "w", stdout); ios_base::sync_with_stdio(0); istream::sync_with_stdio(0); cin.tie(0); cout.tie(0); srand(time(0)); cin >> n; for (int i = 1; i <= n; i++) {cin >> a[i]; val[a[i]].pb(i); mk[a[i]] = 1;} for (int i = 1; i < n; i++) { int x, y; cin >> x >> y; g[x].pb(y); from[y] = x; } dfs(1); for (l = 1; l <= 100; l++) if (mk[l]) for (r = l; r <= 100; r++) { if (!mk[r]) break; if (!(l <= a[1] && a[1] <= r)) continue; bad = 0; vector <int> gr; gr.clear(); for (int i = 1; i <= n; i++) st[i].clear(); for (int i = l; i <= r; i++) gr.pb(val[i][0]); sort(gr.begin(), gr.end(), cmp); for (auto it : gr) {dfs_rev(it); if (bad) break;} if (!bad) {mkr[l][r] = 1; ans++;} } for (int i = 1; i <= 100; i++) sort(val[i].begin(), val[i].end(), cmpr); for (l = 1; l <= 100; l++) if (mk[l]) for (r = l; r <= 100; r++) { if (!mk[r]) break; if (mkr[l][r]) continue; if (!(l <= a[1] && a[1] <= r)) continue; bad = 0; vector <int> gr; gr.clear(); for (int i = 1; i <= n; i++) st[i].clear(); for (int i = l; i <= r; i++) gr.pb(val[i][0]); sort(gr.begin(), gr.end(), cmp); for (auto it : gr) {dfs_rev(it); if (bad) break;} if (!bad) {mkr[l][r] = 1; ans++;} } // for (l = 1; l <= 100; l++) // if (mk[l]) // for (r = l; r <= 100; r++) // { // if (!mk[r]) break; // // if (mkr[l][r]) continue; // // if (!(l <= a[1] && a[1] <= r)) continue; // // bad = 0; // // vector <int> gr; gr.clear(); // // for (int i = 1; i <= n; i++) st[i].clear(); // // for (int i = l; i <= r; i++) gr.pb(val[i][rand() % sz(val[i])]); // // sort(gr.begin(), gr.end(), cmp); // // for (auto it : gr) {dfs_rev(it); if (bad) break;} // // if (!bad) {mkr[l][r] = 1; ans++;} // } cout << ans << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...