Submission #636617

#TimeUsernameProblemLanguageResultExecution timeMemory
636617marlicuZagrade (COI17_zagrade)C++14
10 / 100
3047 ms113356 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 (false && subalbero[ga] < subalbero[gb]) { swap(a, b); swap(ga, gb); } for (auto nx : piu[gb]) risposta += 1LL * nx.Y * meno[ga][-nx.X - shift[gb] - shift[ga]]; for (auto nx : meno[gb]) risposta += 1LL * nx.Y * piu[ga][-nx.X - shift[gb] - shift[ga]]; shift[gruppo[nodo]] += delta; for (auto nx : piu[gb]) piu[ga][nx.X + shift[gb] - shift[ga]] += nx.Y; for (auto nx : meno[gb]) meno[ga][nx.X + shift[gb] - shift[ga]] += nx.Y; piu[ga][-1 - shift[ga]] = 0; meno[ga][1 - shift[ga]] = 0; subalbero[ga] += subalbero[gb]; cerr << a << ' ' << b << ' ' << delta << '\n'; cerr << shift[ga] << ' ' << shift[gb] << ' ' << risposta << ' ' << nodo << '\n'; cerr << "piu "; for (auto nx : piu[ga]) cerr << nx.X << ' ' << nx.Y << " : "; cerr << '\n'; cerr << "meno "; for (auto nx : meno[ga]) cerr << nx.X << ' ' << nx.Y << " : "; cerr << '\n'; cerr << '\n'; 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"; dfs(nnodo, nodo); 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...