社区讨论

请求添加 spj

P6718 [CCO 2018] Flop Sorting参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lobgtskw
此快照首次捕获于
2023/10/29 20:46
2 年前
此快照最后确认于
2023/11/04 02:08
2 年前
查看原帖
spj 代码来自 loj:
CPP
// Author: HeRaNO
#include "testlib.h"

int a[1 << 12], b[1 << 12], pans[1 << 12];
std::pair<int, int> mx[1 << 13], mn[1 << 13];

inline void BuildTree(int u, int l, int r)
{
	if (l + 1 == r)
	{
		mn[u] = mx[u] = {a[l], l};
		return ;
	}
	int m = l + r >> 1;
	BuildTree(u << 1, l, m);
	BuildTree(u << 1 | 1, m, r);
	mx[u] = std::max(mx[u << 1], mx[u << 1 | 1]);
	mn[u] = std::min(mn[u << 1], mn[u << 1 | 1]);
	return ;
}

inline void modify(int u, int x, int v, int pl, int pr)
{
	if (pl + 1 == pr)
	{
		mn[u] = mx[u] = {v, x};
		return ;
	}
	int m = pl + pr >> 1;
	if (x < m) modify(u << 1, x, v, pl, m);
	else modify(u << 1 | 1, x, v, m, pr);
	mx[u] = std::max(mx[u << 1], mx[u << 1 | 1]);
	mn[u] = std::min(mn[u << 1], mn[u << 1 | 1]);
	return ;
}

inline std::pair<int, int> qmax(int u, int l, int r, int pl, int pr)
{
	if (l == pl && r == pr) return mx[u];
	int m = pl + pr >> 1;
	if (r <= m) return qmax(u << 1, l, r, pl, m);
	else if (m <= l) return qmax(u << 1 | 1, l, r, m, pr);
	return std::max(qmax(u << 1, l, m, pl, m), qmax(u << 1 | 1, m, r, m, pr));
}

inline std::pair<int, int> qmin(int u, int l, int r, int pl, int pr)
{
	if (l == pl && r == pr) return mn[u];
	int m = pl + pr >> 1;
	if (r <= m) return qmin(u << 1, l, r, pl, m);
	else if (m <= l) return qmin(u << 1 | 1, l, r, m, pr);
	return std::min(qmin(u << 1, l, m, pl, m), qmin(u << 1 | 1, m, r, m, pr));
}

inline void dfs(int u, int l, int r)
{
	if (l + 1 == r) { pans[l] = mx[u].first; return ; }
	int m = l + r >> 1;
	dfs(u << 1, l, m); dfs(u << 1 | 1, m, r);
	return ;
}

int main(int argc, char *argv[])
{
	registerTestlibCmd(argc, argv);
	int n = inf.readInt();
	for (int i = 0; i < n; i++)
		a[i] = inf.readInt();
	for (int i = 0; i < n; i++)
		b[i] = inf.readInt();
	BuildTree(1, 0, n);
	int Q = ouf.readInt(1, 300000);
	for (int i = 1; i <= Q; i++)
	{
		int l = ouf.readInt(1, n);
		int r = ouf.readInt(1, n);
		if (l > r)
			quitf(_wa, "l > r on operation #%d", i);
		--l;
		std::pair<int, int> mxInfo = qmax(1, l, r, 0, n);
		std::pair<int, int> mnInfo = qmin(1, l, r, 0, n);
		modify(1, mxInfo.second, mnInfo.first, 0, n);
		modify(1, mnInfo.second, mxInfo.first, 0, n);
	}
	dfs(1, 0, n);
	for (int i = 0; i < n; i++)
		if (b[i] != pans[i])
			quitf(_wa, "answer differ on position %d", i + 1);
	quitf(_ok, "ok");
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...