제출 #1159690

#제출 시각아이디문제언어결과실행 시간메모리
1159690ProtonDecay3149월 (APIO24_september)C++20
100 / 100
78 ms9620 KiB
#include "september.h"
#include<bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> pi;
typedef vector<pi> vpi;
#define pb push_back

vi invert(const vi& a) {
    int n = a.size();
    n++;
    vi inv(n, 0);

    for(int i = 0; i < n - 1; i++) {
        inv[a[i]] = i;
    }

    return inv;
}

int solve(int N, int M, vi F, vvi S) {
	vvi sinv;
    for(int i = 0; i < M; i++) {
        sinv.pb(invert(S[i]));
    }

    vpi consts;

    // Constraints across entries
    for(int i = 1; i < N; i++) {
        int mn = N, mx = 0;

        for(int j = 0; j < M; j++) {
            mn = min(mn, sinv[j][i]);
            mx = max(mx, sinv[j][i]);
        }

        consts.pb({mn, mx});
    }

    // Tree constraints
    for(int i = 1; i < N; i++) {
        // i is cur node
        int par = F[i]; // par is parent
        // par must be to the right of i
        // otherwise we have a constraint

        if(par == 0) continue;

        for(int j = 0; j < M; j++) {
            if(sinv[j][par] < sinv[j][i]) consts.pb({sinv[j][par], sinv[j][i]});
        }
    }

    // Solving the constraints
    vi to_add(N - 1, 0);

    for(auto [in, out] : consts) {
        to_add[in]++;
        to_add[out]--;
    }

    int cursum = 0;

    int ans = 0;

    for(int i = 0; i < N - 1; i++) {
        cursum += to_add[i];

        // cerr << cursum << " ";

        if(cursum == 0) ans++;
    }
    // cerr << endl;
    
    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...