Submission #1369708

#TimeUsernameProblemLanguageResultExecution timeMemory
1369708future9월 (APIO24_september)C++20
100 / 100
394 ms21940 KiB
#include<bits/stdc++.h>
#include "september.h"
#include <vector>
using namespace std;
int timee=0;
int start[100005];
int stop[100005];
vector<int>g[100005];
int depth[100005];
int tp[100005];
void dfs(int u)
{
    timee++;
    start[u]=timee;
    tp[timee]=u;
    for(auto v:g[u])
    {
        depth[v]=depth[u]+1;
        dfs(v);
    }
    stop[u]=timee;
}
int dem=0;
int cnt[100005];
pair<int,int>min(pair<int,int>a,pair<int,int>b)
{
    if(a.first<=b.first)return a;
    return b;
}
pair<int,int> tree[400005];
int lazy[400005];
void init(int id,int l,int r)
{
    if(l==r)
    {
        tree[id].first=1e9+depth[tp[l]];
        tree[id].second=l;
        return;
    }
    int mid=(l+r)/2;
    init(id*2,l,mid);
    init(id*2+1,mid+1,r);
    tree[id]=min(tree[id*2],tree[id*2+1]);
}
void push(int id)
{
    if(lazy[id]==0)return;
    tree[id*2].first+=lazy[id];
    tree[id*2+1].first+=lazy[id];
    lazy[id*2]+=lazy[id];
    lazy[id*2+1]+=lazy[id];
    lazy[id]=0;
}
void update(int id,int l,int r,int u,int v,int val)
{
    if(l>v||r<u)return;
    if(l>=u&&r<=v)
    {
        tree[id].first+=val;
        lazy[id]+=val;
        return;
    }
    push(id);
    int mid=(l+r)/2;
    update(id*2,l,mid,u,v,val);
    update(id*2+1,mid+1,r,u,v,val);
    tree[id]=min(tree[id*2],tree[id*2+1]);
}
int lim;
void add(int u)
{
    cnt[u]++;
    if(cnt[u]==lim)dem++;
}
int solve(int N, int M, std::vector<int> F, std::vector<std::vector<int>> S)
{
    for(int i=0; i<N; i++)cnt[i]=0;
    timee=0;
    dem=0;
    lim=M;
    for(int i=1; i<=4*N; i++)lazy[i]=0;
    for(int i=0; i<N; i++)g[i].clear();
    for(int i=1; i<N; i++)g[F[i]].push_back(i);
    dfs(0);
    init(1,1,N);
    for(int i=0; i<M; i++)
    {
        S[i].push_back(0);
        reverse(S[i].begin(),S[i].end());
    }
    int cnt_check=0;
    int ans=0;
    for(int i=1; i<N; i++)
    {
        for(int j=0; j<M; j++)add(S[j][i]);
        int u=S[0][i];
        update(1,1,N,start[u],start[u],-1e9);
        update(1,1,N,start[u],stop[u],-1);
        while(tree[1].first==0)
        {
            cnt_check++;
            update(1,1,N,tree[1].second,tree[1].second,1e9);
        }
        if(cnt_check==i&&dem==i)ans++;
        //cout<<u<<'\n';
    }
    return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...