제출 #1202526

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

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

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

void dfs(int v , int p)
{
        sub[v] = 1;
        idx[v] = ++cur_idx;
        arc[idx[v]] = v;
        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 sgt[M][N * 4];

void build(int idx , int l , int r , int ty)
{
        if(l == r)
        {
                sgt[ty][idx] = nextm[ty][SC[ty][l - 1]];
                return;
        }
        int mid = (l + r) >> 1;
        build(2 * idx , l , mid , ty);
        build(2 * idx + 1 , mid + 1 , r , ty);
        sgt[ty][idx] = min(sgt[ty][idx * 2] , sgt[ty][idx * 2 + 1]);
}

int ask(int idx , int l , int r , int ql , int qr , int ty)
{
        if(ql > r or l > qr) return INF;
        else if(ql <= l && r <= qr) return sgt[ty][idx];
        int mid = (l + r) >> 1;
        return min(ask(2 * idx , l , mid , ql , qr , ty) , ask(2 * idx + 1 , mid + 1 , r , ql , qr , ty));
}

int solve(int n , int m , vector < int > F , vector < vector < int > > S)
{
        SC = 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 = 0;
        vector < vector < int > > cur(m);
        nextm.assign(m , vector < int > (n + 1 , INF));
        for(int i = 0;i < m;i++)
        {
                set < int > st;
                for(int v = 1;v <= n - 1;v++) st.insert(idx[v]);
                for(int j = 0;j < S[i].size();j++)
                {
                        int l = idx[S[i][j]];
                        int r = idx[S[i][j]] + sub[S[i][j]] - 1;
                        if(!st.size()) break;
                        if(l > *st.rbegin()) continue;
                        auto it = st.lower_bound(l);
                        vector < int > rm;
                        while(it != st.end())
                        {
                                int fi = *it;
                                if(fi <= r)
                                {
                                        nextm[i][arc[fi]] = j;
                                        rm.push_back(fi);
                                }
                                else break;
                                it++;
                        }
                        for(int ind : rm) st.erase(ind);
                }
        }
        for(int i = 0;i < m;i++)
        {
                build(1 , 1 , n - 1 , i);
        }
        for(int i = 0;i < S[0].size();i++)
        {
                for(int j = 0;j < m;j++) cur[j].push_back(S[j][i]);
                for(int j = 0;j < m;j++) sort(cur[j].begin() , cur[j].end());
                set < vector < int > > st;
                for(int j = 0;j < m;j++) st.insert(cur[j]);
                if(st.size() != 1) continue;
                bool can = 1;
                for(int j = 0;j < m;j++)
                {
                        int mn = ask(1 , 1 , n - 1 , i + 2 , S[j].size() , j);
                        if(mn <= i) can = 0;
                }
                if(can)
                {
                        ++res;
                        for(int j = 0;j < m;j++) cur[j].clear();
                }
        }
        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...