Submission #636602

#TimeUsernameProblemLanguageResultExecution timeMemory
636602marlicuZagrade (COI17_zagrade)C++14
0 / 100
91 ms46408 KiB
#include <bits/stdc++.h> using namespace std; #define X first #define Y second typedef long long ll; typedef pair <int, int> pii; const int MAXN = 3e5 + 5; int n; char parentesi[MAXN]; vector <int> connessioni[MAXN]; map <int, int> piu[MAXN]; map <int, int> meno[MAXN]; int subalbero[MAXN]; int shift[MAXN]; int gruppo[MAXN]; ll risposta; void collegare(int a, int b, int delta) { int& ga = gruppo[a]; int& gb = gruppo[b]; int nodo = b; if (true || subalbero[ga] <= subalbero[gb]) { swap(a, b); swap(ga, gb); } int shiftR = shift[gb] - shift[ga]; for (auto nx : piu[gb]) risposta += nx.Y * meno[ga][-nx.X - shiftR]; for (auto nx : meno[gb]) risposta += nx.Y * piu[ga][-nx.X - shiftR]; shift[gruppo[nodo]] += delta; shiftR = shift[gb] - shift[ga]; for (auto nx : piu[gb]) piu[ga][nx.X + shiftR] += nx.Y; for (auto nx : meno[gb]) meno[ga][nx.X + shiftR] += nx.Y; piu[ga][-1 + shift[ga]] = 0; meno[ga][1 + shift[ga]] = 0; subalbero[ga] += subalbero[gb]; gb = ga; } void dfs(int nodo, int pnodo) { subalbero[nodo] = 1; if (parentesi[nodo] == '(') piu[nodo][1]++; else meno[nodo][-1]++; for (auto nnodo : connessioni[nodo]) { if (nnodo == pnodo) continue; //cerr << "qui "<< nodo << ' ' << nnodo <<"\n"; collegare(nodo, nnodo, (parentesi[nodo] == '(' ? 1 : -1)); } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n; for (int i = 0; i < n; i++) { cin >> parentesi[i]; gruppo[i] = i; } for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; u--, v--; connessioni[u].push_back(v); connessioni[v].push_back(u); } dfs(0, -1); cout << risposta << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...