제출 #1261442

#제출 시각아이디문제언어결과실행 시간메모리
1261442nerrrmin9월 (APIO24_september)C++20
0 / 100
7 ms12104 KiB
#include "september.h"

#include <vector>
#define pb push_back
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e5 + 10;
int n, m;
vector < int > g[maxn];
int tmr;
int pos[maxn];
int a[maxn], label[maxn];
int tin[maxn], tout[maxn];
void dfs(int beg, int from)
{
    tmr ++;
    a[tmr] = pos[beg];
    label[beg] = tmr;
    tin[beg] = tmr;
    for (auto nb: g[beg])
    {
        if(nb == beg)continue;
        dfs(nb, beg);
    }
    tout[beg] = tmr;
}

int t[maxn * 4];

void build(int i, int l, int r)
{
    if(l == r)
    {
        t[i] = a[l];
        return;
    }
    int mid = (l + r)/2;
    build(2*i, l, mid);
    build(2*i+1, mid+1, r);
    t[i] = max(t[2*i], t[2*i+1]);
}
int upos, uval;
void update(int i, int l, int r)
{
    if(l == r)
    {
        t[i] = uval;
        a[l] = uval;
        return;
    }
    int mid = (l + r)/2;
    if(upos <= mid)update(2*i, l, mid);
    else update(2*i+1, mid+1, r);
    t[i] = max(t[2*i], t[2*i+1]);
}
int ql, qr;
int query(int i, int l, int r)
{
    if(qr < l || ql > r)return 0;
    if(ql <= l && r <= qr)return t[i];
    int mid = (l + r)/2;
    return max(query(2*i, l, mid), query(2*i+1, mid+1, r));
}

int solve(int N, int M, std::vector<int> F, std::vector<std::vector<int>> S)
{

    n = N;
    m = M;
    for (int i = 0; i < n; ++ i)
        g[i].clear();
    for (int i = 0; i < n; ++ i)
    {
        int par = F[i];
        if(par != -1)g[par].pb(i);
    }
    for (int i = 0; i < m; ++ i)
    {
        for (int j = 0; j < n-1; ++ j)
        {
            int x = S[i][j];
            pos[x] = j;
        }
    }
    tmr = -1;
    dfs(0, -1);
    build(1, 1, tmr);
    int mx = 0;
    int day = 0;
    for (int d = 0; d < M; ++ d)
    {
        mx = 0;
        day = 0;
        int st = 0;
        for (int i = 0; i < S[0].size(); ++ i)
        {
            int v = S[0][i];
            ql = tin[v];
            qr = tout[v];
            int nxt = query(1, 1, tmr);
            mx = max(mx, nxt);
            if(mx == i)
            {
                int rgl = st, rgr = i;
                for (int k = rgr; k <= rgr; ++ k)
                {
                    upos = label[k];
                    uval = rgr;
                    update(1, 1, tmr);
                }
                day ++;
                mx = i + 1;
                st = i + 1;
            }
        }

    }
    return day;
}
#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...