MLE或RE求助
查看原帖
MLE或RE求助
936147
Pigsyy楼主2023/9/26 13:44

第 11 个测试点本地测没问题,但不是 RERE 就是 MLEMLE,求解答:

#include <bits/stdc++.h>

using namespace std;

const int SIZE = 5e6 + 10;

int N;
int A[SIZE];
vector<int> G[SIZE], DA, DB;
int dfn[SIZE], Time_Stamp;
int F[SIZE][22], Posa[SIZE], Posb[SIZE];
int Result[SIZE], Fa[SIZE];

void DFS(int u, int fa)
{
	if (!dfn[u])
		dfn[u] = ++ Time_Stamp;
	DA.push_back(u);
	
	for (auto c : G[u])
	{
		if (c == fa) continue;
		Fa[c] = u;
		DFS(c, u);
		DA.push_back(u);
	}
}

int Build()
{
	memset(F, 0x3f, sizeof F);
	int M = log2(DB.size()) + 1;
	
	for (int j = 0; j < M; j ++)
		for (int i = 0; i + (1 << j) - 1 < DB.size(); i ++)
			if (!j) F[i][j] = DB[i];
			else F[i][j] = min(F[i][j - 1], F[i + (1 << j - 1)][j - 1]);
}

int Query(int l, int r)
{
	int len = r - l + 1, K = log2(len);
	return min(F[l][K], F[r - (1 << K) + 1][K]);
}

int LCA(int u, int v)
{
	if (Posb[u] > Posb[v]) swap(u, v);
	return Posa[Query(Posb[u], Posb[v])];
}

void DFS2(int u, int fa)
{
	for (auto c : G[u])
	{
		if (c == fa) continue;
		DFS2(c, u);
		Result[u] += Result[c];
	}
}

signed main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    
    cin >> N;
    
    for (int i = 1; i <= N; i ++)
    	cin >> A[i];
    for (int i = 1; i < N; i ++)
    {
    	int u, v;
    	cin >> u >> v;
    	G[u].push_back(v), G[v].push_back(u);
	}
	
	DFS(1, -1);
	
	for (int i = 0; i < DA.size(); i ++)
		DB.push_back(dfn[DA[i]]), Posa[dfn[DA[i]]] = DA[i], Posb[DA[i]] = i;
		
	Build();
	
	for (int i = 1; i < N; i ++)
		Result[A[i]] ++, Result[A[i + 1]] ++, Result[LCA(A[i], A[i + 1])] --, Result[Fa[LCA(A[i], A[i + 1])]] --;
	
	DFS2(1, -1);
	
	for (int i = 2; i <= N; i ++)
		Result[A[i]] --;
	
	for (int i = 1; i <= N; i ++)
		cout << Result[i] << endl;

	return 0;
}

2023/9/26 13:44
加载中...