Submission #1199780

#TimeUsernameProblemLanguageResultExecution timeMemory
119978012345678Zagrade (COI17_zagrade)C++20
100 / 100
661 ms41760 KiB
#include <bits/stdc++.h>

using namespace std;

const int nx=3e5+5;

#define ll long long

ll n, u, v, sz[nx], used[nx], cnt[nx], res;
char c[nx];
vector<ll> d[nx];

int dfssz(int u, int p)
{
    sz[u]=1;
    for (auto v:d[u]) if (v!=p&&!used[v]) sz[u]+=dfssz(v, u);
    return sz[u];
}

int findcentroid(int u, int p, int rtsz)
{
    for (auto v:d[u]) if (v!=p&&!used[v]&&2*sz[v]>rtsz) return findcentroid(v, u, rtsz);
    return u;
}

void dfsquery(int u, int p, int mn, int cur)
{
    if (cur==mn&&cur<=0) res+=cnt[-cur];
    for (auto v:d[u]) 
    {
        if (v==p||used[v]) continue;
        int newcur=cur+(c[v]=='('?1:-1);
        dfsquery(v, u, min(mn, newcur), newcur);
    } 
}

void dfsadd(int u, int p, int mn, int cur, int vl)
{
    if (mn>=0) cnt[cur]+=vl;
    for (auto v:d[u])
    {
        if (v==p||used[v]) continue;
        int newcur=cur+(c[v]=='('?1:-1);
        dfsadd(v, u, min(mn+(c[v]=='('?1:-1), 0), newcur, vl);
    }
}

void decomposition(int u)
{
    u=findcentroid(u, u, dfssz(u, u));
    used[u]=1;
    if (c[u]=='(') cnt[1]++;
    for (int i=0; i<d[u].size(); i++)
    {
        v=d[u][i];
        if (used[v]) continue;
        dfsquery(v, u, c[v]=='('?1:-1, c[v]=='('?1:-1);
        int mn=c[u]=='('?0:-1, cur=c[u]=='('?1:-1;
        int newcur=cur+(c[v]=='('?1:-1);
        dfsadd(v, u, min(mn+(c[v]=='('?1:-1), 0), newcur, 1);
    }
    if (c[u]=='(') cnt[1]--;
    for (int i=0; i<d[u].size(); i++)
    {
        v=d[u][i];
        if (used[v]) continue;
        int mn=c[u]=='('?0:-1, cur=c[u]=='('?1:-1;
        int newcur=cur+(c[v]=='('?1:-1);
        dfsadd(v, u, min(mn+(c[v]=='('?1:-1), 0), newcur, -1);
    }
    for (int i=d[u].size()-1; i>=0; i--)
    {
        v=d[u][i];
        if (used[v]) continue;
        dfsquery(v, u, c[v]=='('?1:-1, c[v]=='('?1:-1);
        int mn=c[u]=='('?0:-1, cur=c[u]=='('?1:-1;
        int newcur=cur+(c[v]=='('?1:-1);
        dfsadd(v, u, min(mn+(c[v]=='('?1:-1), 0), newcur, 1);
    }
    res+=cnt[0];
    for (int i=d[u].size()-1; i>=0; i--)
    {
        v=d[u][i];
        if (used[v]) continue;
        int mn=c[u]=='('?0:-1, cur=c[u]=='('?1:-1;
        int newcur=cur+(c[v]=='('?1:-1);
        dfsadd(v, u, min(mn+(c[v]=='('?1:-1), 0), newcur, -1);
    }
    //for (int i=0; i<=5; i++) cout<<"c "<<i<<' '<<cnt[i]<<'\n';
    //cout<<"centroid "<<u<<' '<<res<<'\n';
    for (auto v:d[u]) if (!used[v]) decomposition(v);
}

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n;
    for (int i=1; i<=n; i++) cin>>c[i];
    for (int i=1; i<n; i++) cin>>u>>v, d[u].push_back(v), d[v].push_back(u);
    decomposition(1);
    cout<<res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...