답안 #785092

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
785092 2023-07-17T04:57:44 Z 이동현(#10024) Zagrade (COI17_zagrade) C++17
10 / 100
321 ms 36104 KB
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
using namespace std;

const int NS = (int)3e5 + 4;
int cnt[NS];

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int n;
    cin >> n;
    string s;
    cin >> s;
    vector<vector<int>> way(n);
    for(int i = 1; i < n; ++i){
        int x, y;
        cin >> x >> y;
        --x, --y;
        way[x].push_back(y);
        way[y].push_back(x);
    }

    int ans = 0;

    vector<int> sz(n), chk(n);
    auto getsz = [&](auto&&self, int x, int pr)->void{
        sz[x] = 1;
        for(auto&nxt:way[x]){
            if(nxt == pr || chk[nxt]) continue;
            self(self, nxt, x);
            sz[x] += sz[nxt];
        }
    };
    auto getcent = [&](auto&&self, int x, int pr, int asz)->int{
        for(auto&nxt:way[x]){
            if(nxt == pr || chk[nxt]) continue;
            if(sz[nxt] * 2 > asz){
                return self(self, nxt, x, asz);
            }
        }
        return x;
    };
    auto sol = [&](auto&&self, int x)->void{
        getsz(getsz, x, -1);
        x = getcent(getcent, x, -1, sz[x]);
        chk[x] = 1;

        // cout << x << endl;

        vector<int> rb;

        int op = 0;
        auto dfs1 = [&](auto&&self, int x, int pr, int now, int mx)->void{
            now += (s[x] == '(' ? 1 : -1);
            mx = max(mx, now);
            if(now >= mx){
                rb.push_back(now);
                ++cnt[now];
                if(!op && !now) ++ans;
                // cout << x << " LEFT " << now << endl;
            }

            for(auto&nxt:way[x]){
                if(nxt == pr || chk[nxt]){
                    continue;
                }
                self(self, nxt, x, now, mx);
            }
        };

        auto dfs2 = [&](auto&&self, int x, int pr, int now, int mx)->void{
            now += (s[x] == ')' ? 1 : -1);
            mx = max(mx, now);
            if(now >= mx){
                ans += cnt[now];
                // cout << x << " RIGHT " << now << endl;
            }

            for(auto&nxt:way[x]){
                if(nxt == pr || chk[nxt]){
                    continue;
                }
                self(self, nxt, x, now, mx);
            }
        };

        for(op = 0; op < 2; ++op){
            if(s[x] == '(' && !op){
                rb.push_back(1);
                ++cnt[1];
            }
            for(auto&nxt:way[x]){
                if(chk[nxt]){
                    continue;
                }

                dfs2(dfs2, nxt, x, 0, 0);
                dfs1(dfs1, nxt, x, (s[x] == '(' ? 1 : -1), (s[x] == '(' ? 1 : 0));
            }

            for(auto&i:rb){
                cnt[i] = 0;
            }
            rb.clear();

            reverse(way[x].begin(), way[x].end());
        }

        for(auto&nxt:way[x]){
            if(chk[nxt]){
                continue;
            }

            self(self, nxt);
        }
    };

    sol(sol, 0);

    cout << ans << '\n';

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 336 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 306 ms 33540 KB Output is correct
2 Correct 321 ms 33448 KB Output is correct
3 Correct 300 ms 33568 KB Output is correct
4 Correct 307 ms 33512 KB Output is correct
5 Correct 311 ms 33560 KB Output is correct
6 Correct 317 ms 34360 KB Output is correct
7 Correct 300 ms 33488 KB Output is correct
8 Correct 316 ms 34324 KB Output is correct
9 Correct 303 ms 33604 KB Output is correct
10 Correct 282 ms 36104 KB Output is correct
11 Incorrect 270 ms 34904 KB Output isn't correct
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 336 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 336 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 332 KB Output is correct
11 Correct 306 ms 33540 KB Output is correct
12 Correct 321 ms 33448 KB Output is correct
13 Correct 300 ms 33568 KB Output is correct
14 Correct 307 ms 33512 KB Output is correct
15 Correct 311 ms 33560 KB Output is correct
16 Correct 317 ms 34360 KB Output is correct
17 Correct 300 ms 33488 KB Output is correct
18 Correct 316 ms 34324 KB Output is correct
19 Correct 303 ms 33604 KB Output is correct
20 Correct 282 ms 36104 KB Output is correct
21 Incorrect 270 ms 34904 KB Output isn't correct
22 Halted 0 ms 0 KB -