Submission #207110

#TimeUsernameProblemLanguageResultExecution timeMemory
207110HideoZagrade (COI17_zagrade)C++11
100 / 100
671 ms45928 KiB
//#pragma GCC optimize ("Ofast")
//#pragma GCC target ("avx,avx2,fma")

#include <bits/stdc++.h>
using namespace std;

#define all(s) s.begin(), s.end()
#define ok puts("ok")
#define ll long long
#define pb push_back
#define mk make_pair
#define fr first
#define sc second
#define vi vector < int >
#define pi pair < int, int >
#define pii pair < int, pi >
#define next next123

const int N = 3e5 + 7;
const int INF = 1e9 + 7;

pi st[N], fin[N];
int d[N], sub[N];
int n, t;
ll ans;
string s;

vi g[N];

void dfs (int v, int p = 0){
    sub[v] = 1;
    for (int to : g[v]){
        if (!d[to] && to != p){
            dfs(to, v);
            sub[v] += sub[to];
        }
    }
}

int fc (int v){
    bool good = true;
    int sz = sub[v] / 2, p = 0;
    while (good){
        good = false;
        for (int to : g[v]){
            if (!d[to] && to != p && sub[to] > sz){
                good = true;
                p = v; v = to;
                break;
            }
        }
    }
    return v;
}

vi nw;

void calc (int v, int p, int ad = 0, int bal = 0, int mnb = 0, int mxb = 0){
    if (s[v] == '(')
        bal++;
    else
        bal--;
    mxb = max(mxb, bal);
    mnb = min(mnb, bal);
    if (mxb == bal){
        if (bal){
            nw.pb(bal);
            if (mxb == bal){
                if (fin[bal + ad - (!ad)].sc != t)
                    fin[bal + ad - (!ad)] = {0, t};
                ans += fin[bal + ad - (!ad)].fr;
            }
        }
        else {
            nw.pb(INF);
            if (mxb == bal && ad){
                if (fin[bal + 1].sc != t)
                    fin[bal + 1] = {0, t};
                ans += fin[bal + 1].fr;
            }
        }
    }
    if (mnb == bal){
        if (bal){
            nw.pb(bal);
            if (mnb == bal){
                if (st[-bal + (!ad) - ad].sc != t)
                    st[-bal + (!ad) - ad] = {0, t};
                ans += st[-bal + (!ad) - ad].fr;
            }
        }
        else {
            nw.pb(-INF);
            if (mnb == bal && !ad){
                if (st[bal + 1].sc != t)
                    st[bal + 1] = {0, t};
                ans += st[bal + 1].fr;
            }
        }
    }
    for (int to : g[v])
        if (!d[to] && to != p)
            calc(to, v, ad, bal, mnb, mxb);
}

void cd (int v = 1){
    dfs(v);
    v = fc(v);
    fin[0] = {1, t};
    st[0] = {1, t};
    d[v] = 1;
    for (int to : g[v]){
        if (!d[to]){
            nw.clear();
            calc(to, v, (s[v] == '('));
            for (int it : nw){
                if (it == -INF){
                    if (fin[0].sc != t)
                        fin[0] = {0, t};
                    fin[0].fr++;
                }
                else if (it == INF){
                    if (st[0].sc != t)
                        st[0] = {0, t};
                    st[0].fr++;
                }
                else if (it < 0){
                    if (fin[-it].sc != t)
                        fin[-it] = {0, t};
                    fin[-it].fr++;
                }
                else {
                    if (st[it].sc != t)
                        st[it] = {0, t};
                    st[it].fr++;
                }
            }
        }
    }
    ++t;
    for (int to : g[v])
        if (!d[to])
            cd(to);
}

main(){
    cin >> n >> s;
    s = ' ' + s;
    for (int i = 1; i < n; i++){
        int a, b;
        scanf("%d%d", &a, &b);
        g[a].pb(b);
        g[b].pb(a);
    }
    cd();
    cout << ans;
}

Compilation message (stderr)

zagrade.cpp:146:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
 main(){
      ^
zagrade.cpp: In function 'int main()':
zagrade.cpp:151:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &a, &b);
         ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...