Submission #1037823

#TimeUsernameProblemLanguageResultExecution timeMemory
1037823dwuySeptember (APIO24_september)C++17
100 / 100
329 ms23816 KiB
/**         - dwuy -

      />    フ
      |  _  _|
      /`ミ _x ノ
     /      |
    /   ヽ   ?
 / ̄|   | | |
 | ( ̄ヽ__ヽ_)_)
 \二つ

**/
#include "september.h"
#include <bits/stdc++.h>

#define fastIO ios_base::sync_with_stdio(false); cin.tie(NULL)
#define file(a) freopen(a".inp","r",stdin); freopen(a".out", "w",stdout)
#define fi first
#define se second
#define endl "\n"
#define len(s) (int)((s).size())
#define MASK(k)(1LL<<(k))
#define TASK "test"

using namespace std;

typedef tuple<int, int, int> tpiii;
typedef pair<double, double> pdd;
typedef pair<int, int> pii;
typedef long long ll;

const long long OO = 1e18;
const int MOD = 1e9 + 7;
const int INF = 1e9;

struct SMT{
    int n;
    vector<int> tree;

    SMT(int n=0){
        this->n = n;
        this->tree.assign(n<<2|3, 0);
    }

    void update(int pos, int val){
        int id = 1;
        for(int lo=1, hi=n; lo<hi;){
            int mid = (lo + hi)>>1;
            if(pos <= mid) hi = mid, id = id<<1;
            else lo = mid + 1, id = id<<1 | 1;
        }
        tree[id] = max(tree[id], val);
        for(id>>=1; id; id>>=1) tree[id] = max(tree[id<<1], tree[id<<1|1]);
    }

    int get(int l, int r, int id, const int &u, const int &v){
        if(l>v || r<u) return 0;
        if(l>=u && r<=v) return tree[id];
        int mid = (l + r)>>1;
        return max(get(l, mid, id<<1, u, v), get(mid + 1, r, id<<1|1, u, v));
    }

    int get(int l, int r){
        return get(1, n, 1, l, r);
    }
};

int solve(int N, int M, std::vector<int> F, std::vector<std::vector<int>> S) {
	
    int ID = 0;
    vector<int> num(N + 5, 0);
    vector<int> clo(N + 5, 0);
    vector<vector<int>> mx(M + 1, vector<int>(N + 5, 0));
    vector<vector<int>> G(N + 5, vector<int>());
    for(int i=1; i<N; i++) G[F[i]].push_back(i);
    
    function<void(int)> dfs = [&](int u){
        num[u] = ++ID;
        for(int v: G[u]){
            dfs(v);
        }
        clo[u] = ID;
    }; dfs(0);

    for(int t=0; t<M; t++){
        SMT smt(N);
        for(int i=N-2; i>=0; i--){
            mx[t][i] = smt.get(num[S[t][i]], clo[S[t][i]]);
            smt.update(num[S[t][i]], i);
        }
    }

    int res = 0;
    int cmx = 0;
    int cur = 0;
    vector<int> cnt(N + 5, 0);
    for(int i=0; i<N-1; i++){
        for(int j=0; j<M; j++){
            cmx = max(cmx, mx[j][i]);
            cnt[S[j][i]]++;
            if(cnt[S[j][i]] == M) cur++;
        }
        if(cmx <= i && cur == i + 1) res++;
    }
    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...