제출 #1308828

#제출 시각아이디문제언어결과실행 시간메모리
1308828viliZagrade (COI17_zagrade)C++20
0 / 100
3096 ms48668 KiB
#include<bits/stdc++.h> using namespace std; #define LL long long #define X first #define Y second #define PB push_back #define INS insert #define pii pair<int,int> const int N = 3e5; const int INF = 1e9; const int MOD = 1e9+7; vector<int>v[N]; int sz[N]; int flg[N]; int rj; string s; map<pair<int,pii>,int>map2; vector<pair<int,pii>>rlb; void dfs(int tr,int pr=-1) { for (int i=0;i<v[tr].size();i++) { if (v[tr][i]==pr or flg[v[tr][i]]==1) continue; dfs(v[tr][i],tr); sz[tr]+=sz[v[tr][i]]; } sz[tr]++; } int fnd_cnt(int tr,int n,int pr = -1) { for (int i=0;i<v[tr].size();i++) { if (v[tr][i]==pr or flg[v[tr][i]]==1) continue; if (sz[v[tr][i]]*2>n) return fnd_cnt(v[tr][i],n,tr); } return tr; } pii br3; void dfs2(int tr,pii br,pii br2,int pr = -1) { if (s[tr]=='(') br.X++; else { if (br.X>0) br.X--; else br.Y++; } // drugi if (s[tr]==')') br2.Y++; else { if (br2.Y>0) br2.Y--; else br2.X++; } if (s[tr]==')') br3.Y++; else { if (br3.Y>0) br3.Y--; else br3.X++; } if (br.X==0) rj+=map2[{2,{br.Y,br.X}}]; if (br2.Y==0) rj+=map2[{1,{br2.Y,br2.X}}]; if (br3.X==0 and br3.Y==0) rj++; //cout <<tr<<" :: "<<br.X<<" "<<br.Y<< " :: "<<br2.X<<" "<<br2.Y<<" >. "<<br3.X<<" "<<br3.Y<<endl; //cout << map2[{2,{br.Y,br.X}}]<<" + "<<map2[{1,{br2.Y,br2.X}}]<<endl; rlb.PB({1,br}); rlb.PB({2,br2}); for (int i=0;i<v[tr].size();i++) { if (v[tr][i]==pr or flg[v[tr][i]]==1) continue; dfs2(v[tr][i],br,br2,tr); } } void cnt(int tr) { dfs(tr); if (sz[tr]==1) return; int tr2=fnd_cnt(tr,sz[tr]); flg[tr2]=1; // izracunaj start //cout <<tr2<<"START"<<endl; map2.clear(); pii aa = {0,0}; if (s[tr2]=='(') aa.X++; else aa.Y++; map2[{2,{0,0}}]=1; for (int i=0;i<v[tr2].size();i++) { if (flg[v[tr2][i]]==1) continue; br3=aa; dfs2(v[tr2][i],aa,{0,0}); //cout<<"NOVO"<<endl; while (!rlb.empty()) { map2[rlb.back()]++; rlb.pop_back(); } } //rj+=map2[{2,{aa.Y,aa.X}}]; //cout << map2[{2,{aa.Y,aa.X}}]<< " DODANO "<<endl; // izracunaj end for (int i=0;i<v[tr2].size();i++) { if (flg[v[tr2][i]]) continue; cnt(v[tr2][i]); } } void solve() { int n,a,b; cin>>n; cin>>s; s='0'+s; for (int i=0;i<n-1;i++) { int a,b; cin>>a>>b; v[a].PB(b); v[b].PB(a); } cnt(1); cout << rj; } int main() { ios::sync_with_stdio(false); cin.tie(0); solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...