社区讨论
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 条回复,欢迎继续交流。
正在加载回复...