제출 #1249869

#제출 시각아이디문제언어결과실행 시간메모리
1249869sinatbtfardHomework (CEOI22_homework)C++20
100 / 100
585 ms438012 KiB
#include <bits/stdc++.h> #define int long long using namespace std; const int maxn = 4e6 + 10, inf = 1e15; struct segment { pair <int, int> seg[maxn << 2]; void build (int i, int L, int R, vector <int> &a){ if (L == R){ seg[i] = {a[L], L}; return; } int mid = (R + L) >> 1; build(i << 1, L, mid, a); build((i << 1) ^ 1, mid + 1, R, a); seg[i] = min(seg[i << 1], seg[(i << 1) ^ 1]); } pair <int, int> get (int i, int L, int R, int l, int r){ if (L > r || R < l) return {inf, inf}; if (L >= l && R <= r) return seg[i]; int mid = (R + L) >> 1; return min(get(i << 1, L, mid, l, r), get((i << 1) ^ 1, mid + 1, R, l, r)); } }seg; string s; void read (){ cin >> s; } bool b[maxn]; vector <int> a; void MakeA (){ for (int i = 0; i < s.size(); i++){ if (s[i] == '('){ a.push_back(1); if (s[i - 1] == 'n') b[a.size() - 1] = 0; else if (s[i - 1] == 'x') b[a.size() - 1] = 1; } else if (s[i] == ')') a.push_back(-1); else if (s[i] == '?'){ a.push_back(1); a.push_back(-1); } } for (int i = 1; i < a.size(); i++) a[i] += a[i - 1]; } vector <int> adj[maxn]; int MakeT (int l, int r){ if (r - l == 1) return l; int j = seg.get(1, 0, a.size() - 1, l + 1, r - 1).second; int lc = MakeT(l + 1, j); int rc = MakeT(j + 1, r - 1); adj[l].push_back(lc); adj[l].push_back(rc); return l; } struct str { int l, r, s; }; str dfs (int v = 0){ if (adj[v].size() == 0) return {1, 1, 1}; auto [l1, r1, s1] = dfs(adj[v][0]); auto [l2, r2, s2] = dfs(adj[v][1]); if (b[v] == 0) return {min(l1, l2), r1 + r2 - 1, s1 + s2}; return {l1 + l2, max(r1 + s2, r2 + s1), s1 + s2}; } int ans = 0; void solve (){ MakeA(); seg.build(1, 0, a.size() - 1, a); MakeT(0, a.size() - 1); auto [l, r, s] = dfs(); ans = r - l + 1; } void print (){ cout << ans; } int32_t main (){ ios_base::sync_with_stdio(0), cin.tie(0); read(); solve(); print(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...