제출 #1337002

#제출 시각아이디문제언어결과실행 시간메모리
1337002edl0231September (APIO24_september)C++20
100 / 100
171 ms12376 KiB
#include "september.h"
//#include "stub.cpp"
#include <bits/stdc++.h>
#define ll long long
using namespace std;
vector<vector<int>> adj;
vector<ll> wt;
vector<vector<bool>> visited;
vector<ll> val;
vector<ll> par_val;
vector<ll> hsh;
random_device rd;
int n, m;
mt19937_64 rng(rd());
uniform_int_distribution<ll> zw(LLONG_MIN, LLONG_MAX);
void dfs(int node, int id, int par)
{
    visited[id][node] = true;
    for (auto i : adj[node])
    {
        if (i == par) continue;
        if (visited[id][i])
        {
            par_val[id] ^= wt[i];
            continue;
        }
        dfs(i, id, node);
    }
}
bool add_val(int c, vector<int> &F, vector<vector<int>> &S)
{
    for (int i = 0; i < m; i++)
    {
//        cout << "zw";
        val[i] ^= hsh[S[i][c]];
        if (visited[i][S[i][c]]) continue;
        else
        {
            par_val[i] ^= wt[S[i][c]];
            dfs(S[i][c], i, F[S[i][c]]);
        }
    }
    for (int i = 0; i < m; i++)
    {
        if (par_val[i] != val[i]) return false;
    }
//    cout << "zw";
    for (int i = 0; i < m; i++)
    {
        if (val[i] != val[0]) return false;
    }
    return true;
}
int solve(int N, int M, vector<int> F, vector<vector<int>> S)
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    n = N;
    m = M;
    hsh.clear();
    hsh.resize(N);
    adj.clear(); wt.clear(); visited.clear(); val.clear(); par_val.clear();
    adj.resize(N); wt.resize(N); visited.resize(M, vector<bool>(N)); val.resize(M);
    par_val.resize(M);
    for (int i = 0; i < N; i++) wt[i] = zw(rng);
    for (int i = 1; i < N; i++)
    {
//        cout << "zw";
        adj[F[i]].emplace_back(i);
        adj[i].emplace_back(F[i]);
    }
    for (int i = 0; i < N; i++)
    {
        hsh[i] = wt[i];
    }
    for (int i = 0; i < N; i++)
    {
        for (auto j : adj[i])
        {
            if (j == F[i]) continue;
            hsh[i] ^= wt[j];
        }
    }
//    cout << "zw";
    int ans = 0;
    for (int i = 0; i < N - 1; i++) ans += add_val(i, F, S);
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...