Submission #1019592

# Submission time Handle Problem Language Result Execution time Memory
1019592 2024-07-11T04:33:45 Z vjudge1 Zagrade (COI17_zagrade) C++17
100 / 100
398 ms 49704 KB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ld long double
#define ull unsigned long long
#define pii pair<int,int>
#define pll pair<long long, long long>
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define pb push_back
#define lwb lower_bound
#define upb upper_bound

#define TASKNAME "NAME"

void init()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    ///freopen(TASKNAME".INP","r",stdin); freopen(TASKNAME".OUT","w",stdout);
}

const int SZ = 3e5+5;
const ll INF = INT_MAX / 2, MOD = 1e9+7, INFLL = 2e18;
const double epsilon = 1e-3;

int n, a[SZ];
string s;
vector<int> adj[SZ];
ll res = 0;
int szz[SZ];
bool del[SZ];

void dfsSize(int u, int pre)
{
    szz[u] = 1;
    for(int v : adj[u])
    {
        if(v == pre || del[v]) continue;
        dfsSize(v,u);
        szz[u] += szz[v];
    }
}

int findCentroid(int u, int pre, int treeSize)
{
    for(int v : adj[u])
    {
        if(v == pre || del[v]) continue;
        if(szz[v] > treeSize / 2) return findCentroid(v, u, treeSize);
    }
    return u;
}
int cnt[SZ];
vector<int> cur;

void dfs(int u, int pre, int root, int sum, int mn1, int mn2)
{
    if(mn2 >= 0) cur.pb(sum);
    if(mn1 == sum)
    {
        res += 1LL * cnt[-sum];
    }
    if(sum == 0)
    {
        if(mn1 >= 0) res++;
    }
    for(int v : adj[u])
    {
        if(del[v] || v == pre) continue;
        dfs(v, u, root, sum + a[v], min(mn1, sum + a[v]), min(a[v], a[v] + mn2));
    }
}

vector<int> vec;

void updateRes(int root)
{
    for(int u : adj[root])
    {
        if(del[u]) continue;
        int sum = a[root], mn = a[root];
        dfs(u, root, root, sum + a[u], min(mn, sum + a[u]), min(a[u], a[u] + mn));
        while(!cur.empty())
        {
            cnt[cur.back() - a[root]]++;
            vec.pb(cur.back() - a[root]);
            cur.pop_back();
        }
    }
    while(!vec.empty())
    {
        cnt[vec.back()]--;
        vec.pop_back();
    }
}

void solve(int u)
{
    dfsSize(u,0);
    int root = findCentroid(u, 0, szz[u]);
    del[root] = true;
    ll preres = res;
    updateRes(root);
    //cout << root << " - " << res - preres << '\n';
    for(int v : adj[root])
    {
        if(del[v]) continue;
        solve(v);
    }
}

int main()
{
    init();
    cin >> n >> s;
    for(int i = 0; i < s.length(); i++)
    {
        if(s[i] == '(') a[i+1] = 1;
        else a[i+1] = -1;
    }
    for(int i = 1; i < n; i++)
    {
        int u,v;
        cin >> u >> v;
        adj[u].pb(v);
        adj[v].pb(u);
    }
    solve(1);
    for(int i = 1; i <= n; i++)
    {
        if(a[i] == 1) a[i] = -1;
        else a[i] = 1;
    }
    memset(del, false, sizeof(del));
    solve(1);
    cout << res;
}

Compilation message

zagrade.cpp: In function 'void solve(int)':
zagrade.cpp:104:8: warning: unused variable 'preres' [-Wunused-variable]
  104 |     ll preres = res;
      |        ^~~~~~
zagrade.cpp: In function 'int main()':
zagrade.cpp:118:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  118 |     for(int i = 0; i < s.length(); i++)
      |                    ~~^~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 3 ms 7772 KB Output is correct
2 Correct 3 ms 7772 KB Output is correct
3 Correct 4 ms 7876 KB Output is correct
4 Correct 3 ms 7772 KB Output is correct
5 Correct 3 ms 7772 KB Output is correct
6 Correct 3 ms 7772 KB Output is correct
7 Correct 4 ms 7772 KB Output is correct
8 Correct 4 ms 7780 KB Output is correct
9 Correct 4 ms 7772 KB Output is correct
10 Correct 3 ms 7772 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 246 ms 47268 KB Output is correct
2 Correct 257 ms 48992 KB Output is correct
3 Correct 248 ms 47332 KB Output is correct
4 Correct 267 ms 48996 KB Output is correct
5 Correct 244 ms 47332 KB Output is correct
6 Correct 254 ms 48096 KB Output is correct
7 Correct 245 ms 47332 KB Output is correct
8 Correct 270 ms 48236 KB Output is correct
9 Correct 262 ms 47332 KB Output is correct
10 Correct 233 ms 49628 KB Output is correct
11 Correct 233 ms 48484 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 7772 KB Output is correct
2 Correct 3 ms 7772 KB Output is correct
3 Correct 4 ms 7876 KB Output is correct
4 Correct 3 ms 7772 KB Output is correct
5 Correct 3 ms 7772 KB Output is correct
6 Correct 3 ms 7772 KB Output is correct
7 Correct 4 ms 7772 KB Output is correct
8 Correct 4 ms 7780 KB Output is correct
9 Correct 4 ms 7772 KB Output is correct
10 Correct 3 ms 7772 KB Output is correct
11 Correct 246 ms 47268 KB Output is correct
12 Correct 257 ms 48992 KB Output is correct
13 Correct 248 ms 47332 KB Output is correct
14 Correct 267 ms 48996 KB Output is correct
15 Correct 244 ms 47332 KB Output is correct
16 Correct 254 ms 48096 KB Output is correct
17 Correct 245 ms 47332 KB Output is correct
18 Correct 270 ms 48236 KB Output is correct
19 Correct 262 ms 47332 KB Output is correct
20 Correct 233 ms 49628 KB Output is correct
21 Correct 233 ms 48484 KB Output is correct
22 Correct 398 ms 24804 KB Output is correct
23 Correct 371 ms 24808 KB Output is correct
24 Correct 350 ms 24664 KB Output is correct
25 Correct 387 ms 25056 KB Output is correct
26 Correct 282 ms 31900 KB Output is correct
27 Correct 284 ms 28472 KB Output is correct
28 Correct 293 ms 27108 KB Output is correct
29 Correct 240 ms 49704 KB Output is correct
30 Correct 246 ms 49624 KB Output is correct
31 Correct 60 ms 25436 KB Output is correct
32 Correct 230 ms 48480 KB Output is correct