Submission #235720

#TimeUsernameProblemLanguageResultExecution timeMemory
235720KalamZagrade (COI17_zagrade)C++11
100 / 100
1560 ms47608 KiB
// KALAM
# include<bits/stdc++.h>

using namespace std;

const int N = 300000 + 77;
long long A;
int n , sznow , d1[N] , d2[N] , dp1[N] , dp2[N] , sz[N] , T[N];
int root;
char S[N];
bool M[N];
vector < int > adj[N];

void dfsSz(int v , int prev = -1) {
   d1[v] = (prev == -1 ? 0 : d1[prev]) + (S[v] == '(') - (S[v] == ')');
   dp1[v] = (S[v] == '(' ? (prev == -1 ? 0 : min(0 , dp1[prev] + 1)) : dp1[prev] - 1);
   d2[v] = (prev == -1 ? 0 : (prev == root ? ((S[v] == ')') - (S[v] == '(')) : (d2[prev] + ((S[v] == ')') - (S[v] == '(')))));
   dp2[v] = (S[v] == ')' ? (prev == -1 ? 0 : min(0 , dp2[prev] + 1)) : dp2[prev] - 1);
   if(prev == root)
      dp2[v] = (S[v] == ')' ? 0 : -1);
   sz[v] = 1;
   for(int u : adj[v]) {
      if(u == prev || M[u])
         continue ;
      dfsSz(u , v);
      sz[v] += sz[u];
   }
}
void dfsAdd(int v , int prev = -1) {
   if(dp1[v] == 0)
      ++ T[d1[v]];
   for(int u : adj[v])
      if(u != prev && ! M[u])
         dfsAdd(u , v);
}
void dfsGet(int v , int prev = -1) {
   if(dp2[v] == 0)
      A += T[d2[v]];
   for(int u : adj[v])
      if(u != prev && ! M[u])
         dfsGet(u , v);
}
int Centroid(int v , int prev = -1) {
   for(int u : adj[v])
      if(u != prev && !M[u] && sz[u] * 2 > sznow)
         return Centroid(u , v);
   return v;
}
void Decompose(int v) {
   root = v;dfsSz(v);
   sznow = sz[v];
   int c = Centroid(v);
   root = c;dfsSz(c);
   for(int _ = 0;_ < 2;++ _) {
      if(_ == 0)
         if(dp1[c] == 0)
            ++ T[d1[c]];
      for(int u : adj[c])
         if(! M[u])
            dfsGet(u , c) , dfsAdd(u , c);
      if(_ == 1)
         if(dp2[c] == 0)
            A += T[d2[c]];
      for(int i = 0;i <= sznow;++ i)
         T[i] = 0;
      reverse(adj[c].begin() , adj[c].end());
   }
   M[c] = 1;
   for(int v : adj[c])
      if(! M[v])
         Decompose(v);
}

int main() {
   scanf("%d" , & n);
   scanf("%s" , S + 1);
   for(int v , u , i = 1;i < n;++ i)
      scanf("%d %d" , & v , & u) , adj[v].push_back(u) , adj[u].push_back(v);
   Decompose(1);
   printf("%lld\n" , A);
   return 0;
}

Compilation message (stderr)

zagrade.cpp: In function 'int main()':
zagrade.cpp:75:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%d" , & n);
    ~~~~~^~~~~~~~~~~~
zagrade.cpp:76:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%s" , S + 1);
    ~~~~~^~~~~~~~~~~~~~
zagrade.cpp:78:56: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
       scanf("%d %d" , & v , & u) , adj[v].push_back(u) , adj[u].push_back(v);
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...