75pts求hack数据
查看原帖
75pts求hack数据
497711
EnriqueYXH楼主2022/10/31 21:22

RT,对拍拍了好久也找不出,但是洛谷测出来75,INFOJ上ac的了

对不起代码很长

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define up(i, a, b) for (int i = a; i <= b; i++)
#define dn(i, a, b) for (int i = a; i >= b; i--)
using namespace std;
typedef long long ll;
int read() {
	int x = 0, f = 1;char ch = getchar();
	while (ch < '0' || ch > '9') {if (ch == '-') f = -1;ch = getchar();}
	while (ch >= '0' && ch <= '9') {x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();}
	return x * f;
}
const int N = 1e5 + 5, INF = 1e9 + 5;
const ll INFF = 4e18;
int n, m, q, a[N][2];
struct node{
	int l, r, mx[2], mi[2];
	bool ling;
};
struct Seg_Tree{
	node t[N << 3];
	#define k1 (k << 1)
	#define k2 (k << 1 | 1)
	void push_up(int k) {
		t[k].ling = (t[k1].ling | t[k2].ling);
		up(i, 0, 1) t[k].mx[i] = max(t[k1].mx[i], t[k2].mx[i]), t[k].mi[i] = min(t[k1].mi[i], t[k2].mi[i]);
	}
	void build(int k, int l, int r, int tp) {
		t[k].l = l, t[k].r = r;
		up(i, 0, 1) t[k].mx[i] = -INF, t[k].mi[i] = INF;
		if (l == r) {
			int now = a[l][tp];
			if (now == 0) t[k].ling = 1;
			else if (now > 0) t[k].mx[0] = t[k].mi[0] = now;
			else t[k].mx[1] = t[k].mi[1] = -now;
			return;
		}
		int mid = (l + r) >> 1;
		build(k1, l, mid, tp), build(k2, mid + 1, r, tp);
		push_up(k);
	}
	node query(int k, int ql, int qr) {
		int l = t[k].l, r = t[k].r;
		if (ql <= l && r <= qr) return t[k];
		int mid = (l + r) >> 1;
		node now;
		up(i, 0, 1) now.mx[i] = -INF, now.mi[i] = INF;
		now.ling = 0;
		if (ql <= mid) {
			node nxt = query(k1, ql, qr);
			now.ling = (now.ling | nxt.ling);
			up(i, 0, 1) up(i, 0, 1) now.mx[i] = max(now.mx[i], nxt.mx[i]), now.mi[i] = min(now.mi[i], nxt.mi[i]);
		}
		if (qr > mid) {
			node nxt = query(k2, ql, qr);
			now.ling = (now.ling | nxt.ling);
			up(i, 0, 1) up(i, 0, 1) now.mx[i] = max(now.mx[i], nxt.mx[i]), now.mi[i] = min(now.mi[i], nxt.mi[i]);
		}
		return now;
	}
}T1, T2;
int main() {
//	freopen("game.in", "r", stdin);
//	freopen("game.out", "w", stdout);
	n = read(), m = read(), q = read();
	up(i, 1, n) a[i][0] = read();
	up(i, 1, m) a[i][1] = read();
	T1.build(1, 1, n, 0);
	T2.build(1, 1, m, 1);
	up(i, 1, q) {
		int l1 = read(), r1 = read(), l2 = read(), r2 = read();
		node x1 = T1.query(1, l1, r1), x2 = T2.query(1, l2, r2);
//		printf("%d %d %d %d %d\n", x1.ling, x1.mx[0], x1.mi[0], x1.mx[1], x1.mi[1]);
//		printf("%d %d %d %d %d\n", x2.ling, x2.mx[0], x2.mi[0], x2.mx[1], x2.mi[1]);
		ll ans = INFF;
		bool zheng1, fu1, ling1, zheng2, fu2, ling2;
		zheng1 = (x1.mi[0] != INF), fu1 = (x1.mi[1] != INF), ling1 = x1.ling;
		zheng2 = (x2.mi[0] != INF), fu2 = (x2.mi[1] != INF), ling2 = x2.ling;
		if (zheng2 && fu2) {
			if (ling1) ans = 0;
			else ans = max(-(ll)x1.mi[0] * x2.mx[1], -(ll)x1.mi[1] * x2.mx[0]);
		}
		else if (!fu2) {
			if (zheng1 || ling1) {
				if (ling2) ans = 0;
				else {
					if (zheng1) ans = (ll)x1.mx[0] * x2.mi[0];
					else ans = 0;
				}
			}
			else ans = -(ll)x1.mi[1] * x2.mx[0];
		}
		else if (!zheng2) {
			if (fu1 || ling1) {
				if (ling2) ans = 0;
				else {
					if (fu1) ans = (ll)x1.mx[1] * x2.mi[1];
					else ans = 0;
				}
			}
			else ans = -(ll)x1.mi[0] * x2.mx[1];
		}
		else if (!zheng2 && !fu2) {
			ans = 0;
		}
		printf("%lld\n", ans);
	}
	return 0;
}
2022/10/31 21:22
加载中...