제출 #1202429

#제출 시각아이디문제언어결과실행 시간메모리
1202429ElayV139월 (APIO24_september)C++20
25 / 100
94 ms3028 KiB
#include "september.h"
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 1;;
const int INF = INT_MAX;

vector < int > adj[N];
int idx[N] , sub[N];
int cur_idx = 0;

void dfs(int v , int p)
{
        sub[v] = 1;
        idx[v] = ++cur_idx;
        for(int u : adj[v])
        {
                if(u != p)
                {
                        dfs(u , v);
                        sub[v] += sub[u];
                }
        }
}

bool is_anc(int u , int v)
{
        if(idx[v] >= idx[u] && idx[u] + sub[u] - 1 >= idx[v]) return true;
        return false;
}

void fix(int n)
{
        for(int i = 0;i <= n;i++) adj[i].clear() , idx[i] = 0 , sub[i] = 0;
        cur_idx = 0;
}

int solve(int n , int m , vector < int > F , vector < vector < int > > S)
{
        for(int i = 1;i <= n - 1;i++)
        {
                adj[i].push_back(F[i]);
                adj[F[i]].push_back(i);
        }
        dfs(0 , -1);
        int res = -1;
        for(int bit = 0;bit < (1 << S[0].size());bit++)
        {
                vector < vector < vector < int > > > g(m);
                vector < vector < int > > cur(m);
                int cnt = 0;
                for(int i = 0;i < n - 1;i++)
                {
                        for(int j = 0;j < m;j++) cur[j].push_back(S[j][i]);
                        if((1 << i) & bit)
                        {
                                cnt++;
                                for(int j = 0;j < m;j++)
                                {
                                        g[j].push_back(cur[j]);
                                        cur[j].clear();
                                }
                        }
                }
                if(cur[0].size() > 0)
                {
                        cnt++;
                        for(int j = 0;j < m;j++) g[j].push_back(cur[j]);
                }
                for(int i = 0;i < g.size();i++)
                {
                        for(int j = 0;j < g[i].size();j++)
                        {
                                sort(g[i][j].begin() , g[i][j].end());
                        }
                }
                bool can = 1;
                for(int i = 0;i < cnt;i++)
                {
                        set < vector < int > > st;
                        for(int j = 0;j < m;j++) st.insert(g[j][i]);
                        if(st.size() != 1) can = 0;
                }
                if(!can) continue;
                can = 1;
                for(int i = 0;i < m;i++)
                {
                        for(int j = 0;j < g[i].size() - 1;j++)
                        {
                                for(int k = j + 1;k < g[i].size();k++)
                                {
                                        vector < int > fi = g[i][j];
                                        vector < int > si = g[i][k];
                                        for(int u : fi){
                                                for(int v : si){
                                                        if(is_anc(u , v)) can = 0;
                                                }
                                        }
                                }
                        }
                }
                if(can) res = max(res , cnt);
        }
        fix(n);
        return res;
}
#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...