답안 #819961

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
819961 2023-08-10T16:23:56 Z stefanopulos Zagrade (COI17_zagrade) C++17
10 / 100
3000 ms 48544 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[v] > vel / 2)return centroid(u, v, vel);
    }
    return v;
}

ll br = 0;
vector<int> cuvaj;
unordered_map<int,int> kol;

int X = 0; bool f = 0;
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 && kol.count(sumA) == 1)br += kol[sumA];

    if(f == 1){
        if(sumA + X == 0 && min(0, dlA + X) >= 0)br += 1;
        if(sumA + X == 0 && grB >= 0)br += 1;
    }

    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);

    kol.clear(); f = 1;
    for(auto u : g[cen]){
        if(!bio[u]){
            dfs(u, cen, 0, 0, min(0, X));
            
            for(auto c : cuvaj)kol[c] += 1;
            cuvaj.clear();

        }
    }

    reverse(all(g[cen]));

    kol.clear(); f = 0;
    for(auto u : g[cen]){
        if(!bio[u]){
            dfs(u, cen, 0, 0, min(0, X));
            
            for(auto c : cuvaj)kol[c] += 1;
            cuvaj.clear();

        }
    }

    // reverse(all(g[cen]));
    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
*/
 
 
 
 
 
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 7380 KB Output is correct
2 Correct 4 ms 7380 KB Output is correct
3 Correct 4 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 4 ms 7380 KB Output is correct
7 Correct 6 ms 7380 KB Output is correct
8 Correct 4 ms 7380 KB Output is correct
9 Correct 4 ms 7380 KB Output is correct
10 Correct 8 ms 7380 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 310 ms 41976 KB Output is correct
2 Correct 280 ms 41964 KB Output is correct
3 Correct 354 ms 42052 KB Output is correct
4 Correct 301 ms 41996 KB Output is correct
5 Correct 340 ms 42044 KB Output is correct
6 Correct 2546 ms 43292 KB Output is correct
7 Correct 378 ms 42096 KB Output is correct
8 Correct 2721 ms 43352 KB Output is correct
9 Correct 337 ms 41976 KB Output is correct
10 Execution timed out 3075 ms 48544 KB Time limit exceeded
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 7380 KB Output is correct
2 Correct 4 ms 7380 KB Output is correct
3 Correct 4 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 4 ms 7380 KB Output is correct
7 Correct 6 ms 7380 KB Output is correct
8 Correct 4 ms 7380 KB Output is correct
9 Correct 4 ms 7380 KB Output is correct
10 Correct 8 ms 7380 KB Output is correct
11 Correct 310 ms 41976 KB Output is correct
12 Correct 280 ms 41964 KB Output is correct
13 Correct 354 ms 42052 KB Output is correct
14 Correct 301 ms 41996 KB Output is correct
15 Correct 340 ms 42044 KB Output is correct
16 Correct 2546 ms 43292 KB Output is correct
17 Correct 378 ms 42096 KB Output is correct
18 Correct 2721 ms 43352 KB Output is correct
19 Correct 337 ms 41976 KB Output is correct
20 Execution timed out 3075 ms 48544 KB Time limit exceeded
21 Halted 0 ms 0 KB -