社区讨论

40pts求调

P8818[CSP-S 2022] 策略游戏参与者 1已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@m2a69md4
此快照首次捕获于
2024/10/15 16:19
去年
此快照最后确认于
2025/11/04 17:09
4 个月前
查看原帖
马蜂比较丑陋,请见谅,谢谢
CPP
#include <bits/stdc++.h>
// #pragma GCC optimize(2)
// #include <windows.h>
// #include <psapi.h>
// #include <time.h>
using namespace std;
#define Formylove return 0;
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define debug(x) std::cerr << #x << '=' << x << std::endl
#define file(x) freopen(x ".in", "r", stdin), freopen(x ".out", "w", stdout)
#define int long long
#define ls idx << 1
#define rs ls | 1
template <typename T>
void read(T &x)
{
	char ch = getchar();
	x = 0;
	T f = 1;
	while (ch != '-' && (ch < '0' || ch > '9'))
		ch = getchar();
	if (ch == '-')
		f = -1, ch = getchar();
	for (; ch >= '0' && ch <= '9'; ch = getchar())
		x = x * 10 + ch - '0';
	x *= f;
}
template <typename T>
void write(T x, bool flag)
{
	x < 0 ? x = -x, putchar('-') : 0;
	static short Stack[50], top(0);
	do
		Stack[++top] = x % 10, x /= 10;
	while (x);
	while (top)
		putchar(Stack[top--] | 48);
	flag ? putchar('\n') : putchar(' ');
}
int n, m, q;
int a[100005], b[100005];
int l1, r1, l2, r2;
class Tree
{
public:
	struct node
	{
		int l, r, amin, amax, min_more_than_zero, max_less_than_zero;
	} tree[400005];
	void pushup(int idx);
	void build(int l, int r, int idx, int *a);
	int qrymax(int l, int r, int idx);
	int qrymin(int l, int r, int idx);
	int qrymtzmin(int l, int r, int idx);
	int qryltzmax(int l, int r, int idx);
} tree1, tree2;
void Tree::pushup(int idx)
{
	// tree[idx].bmax = max (tree[ls].bmax, tree[rs].bmax);
	// tree[idx].bmin = max (tree[ls].bmin, tree[rs].bmin);
	tree[idx].amax = max(tree[ls].amax, tree[rs].amax);
	tree[idx].amin = min(tree[ls].amin, tree[rs].amin);
	
	if (tree[ls].min_more_than_zero >= 0 and tree[rs].min_more_than_zero >= 0)
	{
		tree[idx].min_more_than_zero = min(tree[ls].min_more_than_zero, tree[rs].min_more_than_zero);
	}
	else if (tree[ls].min_more_than_zero >= 0)
	{
		tree[idx].min_more_than_zero = tree[ls].min_more_than_zero;
	}
	else if (tree[rs].min_more_than_zero >= 0)
	{
		tree[idx].min_more_than_zero = tree[rs].min_more_than_zero;
	}
	
	if (tree[ls].max_less_than_zero < 0 and tree[rs].max_less_than_zero < 0)
	{
		tree[idx].max_less_than_zero = max(tree[ls].max_less_than_zero, tree[rs].max_less_than_zero);
	}
	else if (tree[ls].max_less_than_zero < 0)
	{
		tree[idx].max_less_than_zero = tree[ls].max_less_than_zero;
	}
	else if (tree[rs].max_less_than_zero < 0)
	{
		tree[idx].max_less_than_zero = tree[rs].max_less_than_zero;
	}
}
void Tree::build(int l, int r, int idx, int *a)
{
	if (l == r)
	{
		if (a[l] >= 0)
		{
			tree[idx] = {l, r, a[l], a[l], a[l], 1};
		}
		if (a[l] < 0)
		{
			tree[idx] = {l, r, a[l], a[l], -1, a[l]};
		}
		return;
	}
	tree[idx] = {l, r, 1000000000000000000, -1000000000000000000, -1, 1};
	int mid = (l + r) >> 1;
	build(l, mid, ls, a);
	build(mid + 1, r, rs, a);
	pushup(idx);
}
int Tree::qrymax(int l, int r, int idx)
{
	int res = -1000000000000000000;
	if (l <= tree[idx].l and tree[idx].r <= r)
	{
		return tree[idx].amax;
	}
	int mid = (tree[idx].l + tree[idx].r) >> 1;
	if (l <= mid)
	{
		res = max(qrymax(l, r, ls), res);
	}
	if (r > mid)
	{
		res = max(qrymax(l, r, rs), res);
	}
	return res;
}
int Tree::qrymin(int l, int r, int idx)
{
	int res = 1000000000000000000;
	if (l <= tree[idx].l and tree[idx].r <= r)
	{
		return tree[idx].amin;
	}
	int mid = (tree[idx].l + tree[idx].r) >> 1;
	if (l <= mid)
	{
		res = min(res, qrymin(l, r, ls));
	}
	if (r > mid)
	{
		res = min(res, qrymin(l, r, rs));
	}
	return res;
}
int Tree::qrymtzmin(int l, int r, int idx)
{
	int res = -1;
	if (l <= tree[idx].l and tree[idx].r <= r)
	{
		return tree[idx].min_more_than_zero;
	}
	int mid = (tree[idx].l + tree[idx].r) >> 1;
	if (l <= mid)
	{
		int t = qrymtzmin(l, r, ls);
		if (t >= 0)
		{
			res = t;
		}
	}
	if (r > mid)
	{
		int t = qrymtzmin(l, r, rs);
		if (t >= 0)
		{
			res = (res == -1 ? t : min(res, t));
		}
	}
	return res;
}
int Tree::qryltzmax(int l, int r, int idx)
{
	int res = 1;
	if (l <= tree[idx].l and tree[idx].r <= r)
	{
		return tree[idx].max_less_than_zero;
	}
	int mid = (tree[idx].l + tree[idx].r) >> 1;
	if (l <= mid)
	{
		int t = qryltzmax(l, r, ls);
		if (t < 0)
		{
			res = t;
		}
	}
	if (r > mid)
	{
		int t = qryltzmax(l, r, rs);
		if (t < 0)
		{
			res = (res == 1 ? t : max(res, t));
		}
	}
	return res;
}
int ans;
signed main()
{
	//  file("Luogu_P_8818.cpp");
	// ios::sync_with_stdio(false);
	// cin.tie(0);
	// cout.tie(0);
	
	//  clock_t start,end;    //定义clock_t变量
	//  start = clock();      //开始时间
	read(n), read(m), read(q);
	for (int i = 1; i <= n; ++i)
	{
		read(a[i]);
	}
	for (int i = 1; i <= m; ++i)
	{
		read(b[i]);
	}
	//  end = clock();   //结束时间
	//  cout<<"time = "<<double(end-start)/CLOCKS_PER_SEC<<"s"<<endl;//输出时间
	tree1.build(1, n, 1, a);
	tree2.build(1, m, 1, b);
	while (q--)
	{
		ans = -1000000000000000000;
		read(l1), read(r1), read(l2), read(r2);
		int y = tree2.qrymin(l2, r2, 1);
		int x;
		// cout << y << ' ';
		if (y >= 0) {
			x = tree1.qrymax(l1, r1, 1);
			// cout << x << ' ';
			ans = max (ans, x * y);
		} 
		else {
			x = tree1.qrymtzmin(l1, r1, 1);
			// cout << x << ' ';
			if (x >= 0)
				ans = max (ans, x * y);
		}
		y = tree2.qrymax(l2, r2, 1);
		// cout << y << ' ';
		if (y >= 0) {
			x = tree1.qryltzmax(l1, r1, 1);
			// cout << x << ' ';
			if (x < 0)
				ans = max (ans, x * y);
		}
		else {
			x = tree1.qrymin(l1, r1, 1);
			// cout << x << ' ';
			ans = max (ans, x * y);
		}
		write(ans, 1);
	}
	//  HANDLE hd = GetCurrentProcess();
	//  PROCESS_MEMORY_COUNTERS pmc;
	//  GetProcessMemoryInfo(hd, &pmc, sizeof(pmc));
	//  printf("%lf", double(pmc.WorkingSetSize) / 1024 / 1024);//单位MiB
	
	//  cout << endl;
	Formylove
}

回复

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

正在加载回复...