Submission #714885

#TimeUsernameProblemLanguageResultExecution timeMemory
714885Ahmed57Zagrade (COI17_zagrade)C++14
100 / 100
1231 ms45956 KiB
#include <bits/stdc++.h> using namespace std; #define int long long long long sz[300007];long long all = 0; long long vis[300007]; vector<int> adj[300007]; int ss = 0; long long zz[300007]; string s; long long c = 0; void calc(int no,int pr,int ch,int bra){ if(ss==0){ if(s[no-1]=='('){bra++;ch--;ch=max(ch,0LL);} if(s[no-1]==')'){bra--;ch++;} if(bra>=0&&ch==0)zz[bra]++; }else if(ss==1){ if(s[no-1]=='('){bra++;ch++;} if(s[no-1]==')'){bra--;ch--;ch=max(ch,0LL);} if(bra<=0&&ch==0){ all+=zz[-bra]; } //if(bra==0&&ch==0)c++; }else{ if(s[no-1]=='('){bra++;ch--;ch=max(ch,0LL);} if(s[no-1]==')'){bra--;ch++;} if(bra>=0&&ch==0)zz[bra]--; } for(auto i:adj[no]){ if(i==pr||vis[i])continue; calc(i,no,ch,bra); } } int dfs(int no,int pr){ sz[no] = 1; for(auto i:adj[no]){ if(i==pr||vis[i]!=0)continue; sz[no]+=dfs(i,no); } return sz[no]; } int get_centroid(int no,int ss,int pr){ for(auto i:adj[no]){ if(pr==i||vis[i]!=0)continue; if(sz[i]*2>ss){ return get_centroid(i,ss,no); } } return no; } void centroid(int no){ int cen = get_centroid(no,dfs(no,-1),-1); for(int i = 0;i<=max(1000LL,sz[cen]+5);i++){ zz[i] = 0; } zz[0] = 1; vis[cen] = 1; for(auto i:adj[cen]){ if(vis[i])continue; ss= 0; calc(i,-1,0,0); } if(s[cen-1]==')')all+=zz[1]; for(auto i:adj[cen]){ if(vis[i])continue; ss = 2; calc(i,-1,0,0); ss = 1; calc(i,-1,(s[cen-1]=='('?1:0),(s[cen-1]=='('?1:-1)); //cout<<all<<" "<<i<<endl; ss = 0; calc(i,-1,0,0); } for(auto i:adj[cen]){ if(vis[i])continue; centroid(i); } } signed main(){ ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); int n; cin>>n>>s; for(int i = 0;i<n-1;i++){ int a,b; cin>>a>>b; adj[a].push_back(b); adj[b].push_back(a); } centroid(1); cout<<all<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...