제출 #1360927

#제출 시각아이디문제언어결과실행 시간메모리
1360927Jawad_Akbar_JJ9월 (APIO24_september)C++20
100 / 100
160 ms28668 KiB
#include <iostream>
#include <vector>
#include <set>

using namespace std;
const int N = 1<<18, M = 998244353;
vector<int> nei[N];
set<int> st;
long long Pre[5][N], R[N];
int Mx[5][N], ind[N];

void dfs(int u, int arr[]){
	if (st.size() > 0){
		int k = *begin(st);
		arr[k] = max(arr[k], ind[u]);
	}
	if (u > 0)
		st.insert(ind[u]);

	for (int i : nei[u])
		dfs(i, arr);
	st.erase(ind[u]);
}

int solve(int n, int m, vector<int> P, vector<vector<int>> L){
	for (int i=1;i<n;i++)
		nei[P[i]].push_back(i);

	srand(time(0));
	R[0] = rand();
	for (int i=1;i<=n;i++)
		R[i] = R[i-1] % M * (rand() + 1);

	for (int j=0;j<m;j++){
		L[j].insert(L[j].begin(), 0);
		for (int i=1;i<n;i++){
			ind[L[j][i]] = i;
			Pre[j][i] = Pre[j][i-1] ^ R[L[j][i]];
		}

		dfs(0, Mx[j]);
		for (int i=1;i<=n;i++)
			Mx[j][i] = max(Mx[j][i], Mx[j][i-1]);
	}

	int Ans = 0;
	for (int i=1;i<n;i++){
		long long X = Pre[0][i], t = 1;
		for (int j=0;j<m;j++){
			t &= (Pre[j][i] == X) and (Mx[j][i] <= i),
			Mx[j][i] = Pre[j][i] = 0;
		}

		Ans += t;
		nei[i-1].clear();
	}
	return Ans;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…