没过样例不知道线段树哪里出问题了,求调
查看原帖
没过样例不知道线段树哪里出问题了,求调
483058
陈泽涵爱g编程楼主2023/10/8 13:36
#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
int n, m, q;
const int maxn = 1e5 + 1;
#define mid (r + l) / 2
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
struct kk {
	int pmax, maxx, minn, nmin;
};
struct node {
	kk tree[maxn * 4 + 1], tag[maxn * 4 + 1];
	void inin(int x) {
		for(int i = 1; i <= maxn * 4; i++) {
			tree[i].maxx = tag[i].maxx = -1e18;
			tree[i].minn = tag[i].minn = 1e18;
			tree[i].nmin = tag[i].nmin = 1e18;
			tree[i].pmax = tag[i].pmax = -1e18;
		}
	}
	void pushdown(int rt, int l, int r) {
		tree[rt].maxx = max(tree[rt].maxx, tag[rt].maxx);
		tag[rt << 1].maxx = max(tag[rt].maxx, tag[rt << 1].maxx);
		tag[rt << 1 | 1].maxx = max(tag[rt].maxx, tag[rt << 1 | 1].maxx);
		tag[rt].maxx = -1e18;
		tree[rt].minn = min(tree[rt].minn, tag[rt].minn);
		tag[rt << 1].minn = min(tag[rt].minn, tag[rt << 1].minn);
		tag[rt << 1 | 1].minn = min(tag[rt].minn, tag[rt << 1 | 1].minn);
		tag[rt].minn = 1e18;
		if(tag[rt].pmax < 0) {
			tree[rt].pmax= max(tree[rt].pmax, tag[rt].pmax);
			tag[rt << 1].pmax = max(tag[rt].pmax, tag[rt << 1].pmax);
			tag[rt << 1 | 1].pmax = max(tag[rt].pmax, tag[rt << 1 | 1].pmax);
		}
		tag[rt].maxx = -1e18;
		if(tag[rt].nmin > 0) {
			tag[rt << 1].nmin = min(tag[rt].nmin, tag[rt << 1].nmin);
			tag[rt << 1 | 1].nmin = min(tag[rt].nmin, tag[rt << 1 | 1].nmin);
		}
		tag[rt].nmin = 1e18;
		return ;
	}
	void pushup(int rt, int l, int r) {
		pushdown(rt, l, r);
		pushdown(lson);
		pushdown(rson);
		tree[rt].maxx = max(tree[rt << 1].maxx, tree[rt << 1 | 1].maxx);
		tree[rt].minn = min(tree[rt << 1].minn, tree[rt << 1 | 1].minn);
		tree[rt].nmin = min(tree[rt << 1].nmin, tree[rt << 1 | 1].nmin);
		tree[rt].pmax = max(tree[rt << 1].pmax, tree[rt << 1 | 1].pmax);
		return;
	}
	void pp(int rt, int val) {
		tag[rt].maxx = max(tag[rt].maxx, val);
		tag[rt].minn = min(tag[rt].minn, val);
		if(val >= 0)
			tag[rt].nmin = min(tag[rt].nmin, val);
		if(val < 0)
			tag[rt].pmax = max(tag[rt].pmax, val);
	}
	void update(int rt, int l, int r, int L, int  R, int val) {
		if(L <= l && r <= R) {
			pp(rt, val);
//			cout << "y";
			return 
			;
		}
//		cout << mid;
		pushdown(rt, l, r);
		if(mid >= L) update(lson, L, R, val);
		if(mid < R)  update(rson, L, R, val);
		pushup(rt, l, r);
		return ;
	}
	kk p2(kk a, kk b) {
		a.maxx = max(a.maxx, b.maxx);
		a.minn = min(a.minn, b.minn);
		a.nmin = min(a.nmin, b.nmin);
		a.pmax = max(a.pmax, b.pmax);
	}
	kk query(int rt, int l, int r, int L, int R) {
		if(L <= l && r <= R) {
			return tree[rt];
		}
		pushdown(rt, l, r);
		kk ans;
		if(mid >= L) ans = p2(ans, query(lson, L, R) );
		if(mid < R)  ans = p2(ans, query(rson, L, R) );
		return ans;
	}
} a, b;
signed main() {
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
	cin >> n >> m >> q;
	a.inin(n);
	b.inin(m);
	for(int i = 1; i <= n; i++) {
		int val;
		cin >> val;
		a.update(1, 1, n, i, i, val);
	}
	for(int i = 1; i <= m; i++) {
		int val;
		cin >> val;
		b.update(1 , 1, m, i, i, val);
	}
	for(int i = 1; i <= q; i++) { 
		int l, r;
		cin >> l >> r; 
		kk aans = a.query(1, 1, n, l, r);
		cin >> l >> r; 
		kk bans = b.query(1, 1, m, l, r);
		cout << aans.maxx  << ' ' << aans.minn << ' ' << aans.nmin << ' ' << aans.pmax << '\n';
		int ans = -1e18;
		ans = max(ans, aans.maxx * bans.minn);
		ans = max(ans, aans.minn * bans.maxx);
		if(aans.nmin >= 0) {
			ans = max(ans, aans.nmin * bans.minn);
		} else {
			ans = max(ans, aans.pmax * bans.maxx);
		}
		cout << ans << '\n';
	}
	return 0;
}
2023/10/8 13:36
加载中...