Submission #821378

# Submission time Handle Problem Language Result Execution time Memory
821378 2023-08-11T09:40:33 Z stefanopulos Zagrade (COI17_zagrade) C++17
100 / 100
509 ms 45036 KB
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <bits/stdc++.h>
 
using namespace std;
using namespace __gnu_pbds;
 
typedef long long ll;
typedef long double ldb;
 
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<ldb,ldb> pdd;
 
#define ff(i,a,b) for(int i = a; i <= b; i++)
#define fb(i,b,a) for(int i = b; i >= a; i--)
#define trav(a,x) for(auto& a : x)
 
#define sz(a) (int)(a).size()
#define fi first
#define se second
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
 
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
 
template<typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
 
// os.order_of_key(k) the number of elements in the os less than k
// *os.find_by_order(k)  print the k-th smallest number in os(0-based)
 
const int mod = 1000000007;
const int inf = 1e9 + 5;
const int mxN = 300005; 
 
int n;
string s;
 
vector<int> g[mxN];
 
int cnt[mxN];
bool bio[mxN];
void dfs_cnt(int v, int p){
    cnt[v] = 1;
    for(auto u : g[v]){
        if(u != p && !bio[u]){
            dfs_cnt(u, v);
            cnt[v] += cnt[u];
        }
    }
}
 
int centroid(int v, int p, int vel){
    for(auto u : g[v]){
        if(u == p || bio[u])continue;
        if(cnt[u] > vel / 2)return centroid(u, v, vel);
    }
    return v;
}
 
ll br = 0;
vector<int> cuvaj;
int kol[2 * mxN + 5];
 
int X = 0; bool f = 1;
void dfs(int v, int p, int sumA, int dlA, int grB){
    int Y = (s[v] == '(' ? 1 : -1);
    sumA += Y; dlA = min(dlA, sumA); grB = min(0, grB + Y);
 
    if(dlA >= sumA)br += kol[sumA + mxN];
 
    if(f == 1 && sumA + X == 0)br += (min(0, dlA + X) >= 0) + (grB >= 0);
 
    if(grB == 0)cuvaj.pb(-(sumA + X));
    for(auto u : g[v]){
        if(u != p && !bio[u]){
            dfs(u, v, sumA, dlA, grB);
        }
    }
 
 
}
 
 
void decompose(int v){
    dfs_cnt(v, -1); int cen = centroid(v, -1, cnt[v]);
    bio[cen] = 1; X = (s[cen] == '(' ? 1 : -1);
 
 
    vector<int> svi;
    ff(_,0,1){
        for(auto u : g[cen]){
            if(!bio[u]){
                dfs(u, cen, 0, 0, min(0, X));
                
                for(auto c : cuvaj){
                    kol[c + mxN] += 1;
                    svi.pb(c + mxN);
                }
                cuvaj.clear();
 
            }
        }
 
        for(auto c : svi)kol[c] = 0;
        svi.clear();
 
        reverse(all(g[cen])); f ^= 1;
 
    }
 
    for(auto u : g[cen]){
        if(!bio[u]){
            decompose(u);
        }
    }
 
 
}
 
int main(){
    cin.tie(0)->sync_with_stdio(0);
 
    cin >> n >> s; s = ' ' + s;
    ff(i,1,n - 1){
        int u, v;
        cin >> u >> v;
        g[u].pb(v);
        g[v].pb(u);
    }
 
    decompose(1);
 
    cout << br << '\n';
 
    return 0;
}
/*
 
 
 
// probati bojenje sahovski
*/
 
 
 
 
 
# Verdict Execution time Memory Grader output
1 Correct 4 ms 7380 KB Output is correct
2 Correct 3 ms 7380 KB Output is correct
3 Correct 3 ms 7380 KB Output is correct
4 Correct 4 ms 7380 KB Output is correct
5 Correct 4 ms 7380 KB Output is correct
6 Correct 3 ms 7380 KB Output is correct
7 Correct 3 ms 7380 KB Output is correct
8 Correct 4 ms 7380 KB Output is correct
9 Correct 5 ms 7380 KB Output is correct
10 Correct 4 ms 7380 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 262 ms 42160 KB Output is correct
2 Correct 273 ms 41988 KB Output is correct
3 Correct 250 ms 42072 KB Output is correct
4 Correct 259 ms 41924 KB Output is correct
5 Correct 244 ms 42024 KB Output is correct
6 Correct 266 ms 43124 KB Output is correct
7 Correct 250 ms 42052 KB Output is correct
8 Correct 258 ms 43100 KB Output is correct
9 Correct 253 ms 42024 KB Output is correct
10 Correct 232 ms 44956 KB Output is correct
11 Correct 252 ms 43628 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 7380 KB Output is correct
2 Correct 3 ms 7380 KB Output is correct
3 Correct 3 ms 7380 KB Output is correct
4 Correct 4 ms 7380 KB Output is correct
5 Correct 4 ms 7380 KB Output is correct
6 Correct 3 ms 7380 KB Output is correct
7 Correct 3 ms 7380 KB Output is correct
8 Correct 4 ms 7380 KB Output is correct
9 Correct 5 ms 7380 KB Output is correct
10 Correct 4 ms 7380 KB Output is correct
11 Correct 262 ms 42160 KB Output is correct
12 Correct 273 ms 41988 KB Output is correct
13 Correct 250 ms 42072 KB Output is correct
14 Correct 259 ms 41924 KB Output is correct
15 Correct 244 ms 42024 KB Output is correct
16 Correct 266 ms 43124 KB Output is correct
17 Correct 250 ms 42052 KB Output is correct
18 Correct 258 ms 43100 KB Output is correct
19 Correct 253 ms 42024 KB Output is correct
20 Correct 232 ms 44956 KB Output is correct
21 Correct 252 ms 43628 KB Output is correct
22 Correct 460 ms 19988 KB Output is correct
23 Correct 391 ms 19848 KB Output is correct
24 Correct 509 ms 19764 KB Output is correct
25 Correct 495 ms 19424 KB Output is correct
26 Correct 305 ms 26524 KB Output is correct
27 Correct 298 ms 23144 KB Output is correct
28 Correct 295 ms 21684 KB Output is correct
29 Correct 232 ms 45036 KB Output is correct
30 Correct 229 ms 45028 KB Output is correct
31 Correct 62 ms 22132 KB Output is correct
32 Correct 234 ms 43624 KB Output is correct