我三个平台结果都不一样
查看原帖
我三个平台结果都不一样
520777
LaoXu666楼主2023/2/25 16:58

代码

#include <algorithm>
#include <cstdio>

//C++写法 左闭右开区间
class PersistentSegmentTree {
public:
	struct PersistentSegmentTreeNode {
		int L, R;
		int Sum;
	};
	PersistentSegmentTreeNode Tree[6400005] { };
	int Cnt = 1;

	int Update(int Prev, int L, int R, int Id) {
		int This = Cnt++;
		Tree[This].L = Tree[Prev].L;
		Tree[This].R = Tree[Prev].R;
		Tree[This].Sum = Tree[Prev].Sum + 1;
		int Mid = (L + R) / 2;
		if (R - L > 1) {
			if (Id < Mid) {
				Tree[This].L = Update(Tree[Prev].L, L, Mid, Id);
			} else {
				Tree[This].R = Update(Tree[Prev].R, Mid, R, Id);
			}
		}
		return This;
	}

	int Query(int L01, int R01, int L02, int R02, int Num) {
		//[L01, R01]
		if (R02 - L02 == 1) return L02;
		int X = Tree[Tree[R01].L].Sum - Tree[Tree[L01].L].Sum;
		int Mid = (L02 + R02) / 2;
		if (X > Num) {
			return Query(Tree[L01].L, Tree[R01].L, L02, Mid, Num);
		} else {
			return Query(Tree[L01].R, Tree[R01].R, Mid, R02, Num);
		}
	}
} SegmentTree;

int Initialization(int *ArrL, int *TmpL, int *TmpR, int *RootL) {
	for (int *i = ArrL, *j = TmpL; i < TmpR; i++, j++) {
		*j = *i;
	}
	std::sort(TmpL, TmpR);
	int Size = int(std::unique(TmpL, TmpR) - TmpL);
	for (int *i = TmpL, j = 0; i < TmpR; i++, j++) {
		int X = int(std::lower_bound(TmpL, TmpR, *(ArrL + j)) - ArrL);
		*(RootL + X) = SegmentTree.Update(*(RootL + X - 1), 1, Size, X);
	}
	return Size;
}

int N, M, Arr[200005], Tmp[200005], Root[200005];

int main( ) {
	std::scanf("%d%d", &N, &M);
	for (int i = 0; i < N; i++) {
		std::scanf("%d", &Arr[i]);
	}
	int Size = Initialization(Arr, Tmp, Tmp + N, Root);
	for (int i = 0; i < M; i++) {
		int L, R, Num;
		std::scanf("%d%d%d", &L, &R, &Num);
		L--;
		R--;
		if (L != 0) {
			std::printf("%d\n", Tmp[SegmentTree.Query(Root[L - 1], Root[R], 0, Size, Num)]);
		} else {
			std::printf("%d\n", Tmp[SegmentTree.Query(Root[200004], Root[R], 0, Size, Num)]);
		}
	}
	return 0;
}

本地可以return 0,WA,洛谷离奇CE,Linux(本地)core dumped,不知道有什么问题

2023/2/25 16:58
加载中...