답안 #819958

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
819958 2023-08-10T16:20:37 Z stefanopulos Zagrade (COI17_zagrade) C++17
40 / 100
3000 ms 49572 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;
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 7340 KB Output is correct
5 Correct 4 ms 7380 KB Output is correct
6 Correct 4 ms 7380 KB Output is correct
7 Correct 5 ms 7356 KB Output is correct
8 Correct 4 ms 7380 KB Output is correct
9 Correct 4 ms 7380 KB Output is correct
10 Correct 7 ms 7380 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 289 ms 41904 KB Output is correct
2 Correct 272 ms 41920 KB Output is correct
3 Correct 288 ms 42056 KB Output is correct
4 Correct 285 ms 41912 KB Output is correct
5 Correct 291 ms 42048 KB Output is correct
6 Correct 365 ms 43084 KB Output is correct
7 Correct 295 ms 42040 KB Output is correct
8 Correct 379 ms 43100 KB Output is correct
9 Correct 328 ms 41948 KB Output is correct
10 Correct 481 ms 49572 KB Output is correct
11 Correct 261 ms 42848 KB Output is correct
# 결과 실행 시간 메모리 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 7340 KB Output is correct
5 Correct 4 ms 7380 KB Output is correct
6 Correct 4 ms 7380 KB Output is correct
7 Correct 5 ms 7356 KB Output is correct
8 Correct 4 ms 7380 KB Output is correct
9 Correct 4 ms 7380 KB Output is correct
10 Correct 7 ms 7380 KB Output is correct
11 Correct 289 ms 41904 KB Output is correct
12 Correct 272 ms 41920 KB Output is correct
13 Correct 288 ms 42056 KB Output is correct
14 Correct 285 ms 41912 KB Output is correct
15 Correct 291 ms 42048 KB Output is correct
16 Correct 365 ms 43084 KB Output is correct
17 Correct 295 ms 42040 KB Output is correct
18 Correct 379 ms 43100 KB Output is correct
19 Correct 328 ms 41948 KB Output is correct
20 Correct 481 ms 49572 KB Output is correct
21 Correct 261 ms 42848 KB Output is correct
22 Correct 750 ms 19624 KB Output is correct
23 Correct 696 ms 19312 KB Output is correct
24 Correct 753 ms 19512 KB Output is correct
25 Correct 863 ms 19268 KB Output is correct
26 Execution timed out 3073 ms 27792 KB Time limit exceeded
27 Halted 0 ms 0 KB -