请求添加 spj
查看原帖
请求添加 spj
101800
Falashiro楼主2021/10/27 18:01

spj 代码来自 loj:

// 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;
}
2021/10/27 18:01
加载中...