样例已过,WA_0 求调
查看原帖
样例已过,WA_0 求调
778154
FluoroantimonicAcid楼主2024/10/25 00:03

RT

思路与这篇题解相似,但是找不到错误。

#include <iostream>
#define int long long
using namespace std;
const int N = 1e5 + 7;
struct Node {
	int maxP, minP, maxN, minN;
	bool zero;
	Node() { maxP = minP = maxN = minN = 0; zero = 0; }
	Node(int x) {
		if (x > 0)			maxP = minP = x, maxN = minN = zero = 0;
		else if (x == 0)	maxP = minP = maxN = minN = 0, zero = 1;
		else				maxN = minN = x, maxP = minP = zero = 0;
	}
	Node(int x1, int x2, int x3, int x4, bool x5) :
		maxP(x1), minP(x2), maxN(x3), minN(x4), zero(x5) {}
	Node operator+(Node a) {
		return {
			!maxP || !a.maxP ? maxP | a.maxP : max(maxP, a.maxP),
			!minP || !a.minP ? minP | a.minP : min(maxP, a.maxP),
			!maxN || !a.maxN ? maxN | a.maxN : max(maxN, a.maxN),
			!minN || !a.minN ? minN | a.minN : min(maxN, a.maxN),
			zero || a.zero
		};
	}
};
struct SegmentTree {
	Node tree[N << 2];
	void build(int u, int l, int r, int* arr) {
		if (l == r) return tree[u] = Node(arr[l]), void();
		const int mid = l + r >> 1;
		build(u << 1, l, mid, arr);
		build(u << 1 | 1, mid + 1, r, arr);
		tree[u] = tree[u << 1] + tree[u << 1 | 1];

	}
	Node query(int u, int l, int r, int x, int y) {
		if (x <= l && r <= y) return tree[u];
		const int mid = l + r >> 1;
		if (x > mid) return query(u << 1 | 1, mid + 1, r, x, y);
		if (y <= mid) return query(u << 1, l, mid, x, y);
		return query(u << 1, l, mid, x, y) + query(u << 1 | 1, mid + 1, r, x, y);
	}
} A, B;
int n, m, q, a[N], b[N];
int Ans(Node a, Node b) {
#define Post(X) (!!(X).maxP)
#define Nege(X) (!!(X).maxN)
#define Zero(X) (!!(X).zero)
	return
		!Post(b) && Nege(b)? ( // B <= 0
			Nege(a)? // A < 0
				Zero(b) ? 0 : a.minN * b.maxN
			: // A >= 0
				Zero(a) ? 0 : a.minP * b.minP
		) : !Nege(b) && Post(b)? ( // B >= 0
			Post(a)? // A > 0
				Zero(b) ? 0 : a.maxP * b.minP
			: // A <= 0
				Zero(a) ? 0 : a.maxN * b.maxP
		) : ( // (B <=> 0) or (B only 0)
			Zero(a) ? 0 :
			!Post(a) && Nege(a) ? a.maxN * b.maxP :
			!Nege(a) && Post(a) ? a.minP * b.minN :
			max(a.maxN * b.maxP, a.minP * b.minN)
		);
}

main() {
//	freopen("P8818_1.in", "r", stdin);
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> n >> m >> q;
	for (int i = 1; i <= n; ++ i) cin >> a[i];
	for (int i = 1; i <= m; ++ i) cin >> b[i];
	A.build(1, 1, n, a);
	B.build(1, 1, m, b);
	for (int l1, r1, l2, r2; q --; ) {
		cin >> l1 >> r1 >> l2 >> r2;
		cout << Ans(A.query(1, 1, n, l1, r1), B.query(1, 1, m, l2, r2)) << '\n';
	}
}
2024/10/25 00:03
加载中...