萌新求助线段树WA 1
查看原帖
萌新求助线段树WA 1
716260
SegmentTree_楼主2024/1/21 22:16
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e4+5;
#define lid (id << 1)
#define rid (id << 1 | 1)
struct node{
	int l, r;
	ll ans, sum, lmax, rmax;
};
node tr[N << 2];
int n, q;
int a[N];
void pushup(node &t, node ls, node rs){
	if(ls.rmax < 0 && rs.lmax < 0)
		t.ans=max(ls.rmax, rs.lmax);
	else{
		t.ans = 0;
		if(ls.rmax>0) t.ans += ls.rmax;
		if(rs.lmax>0) t.ans += rs.lmax;
	}
	t.sum = ls.sum + rs.sum;
	t.lmax = max(ls.lmax, ls.sum + rs.lmax);
	t.rmax = max(rs.rmax, rs.sum + ls.rmax);
	t.ans = max(max(ls.ans, rs.ans), ls.rmax + rs.lmax);
}
void build(int id, int l, int r){
	tr[id].l = l;
	tr[id].r = r;
	if (l == r){
		tr[id].sum = tr[id].ans = tr[id].lmax = tr[id].rmax = a[l];
		return;
	}
	int mid = (tr[id].l + tr[id].r) / 2;
	build(lid, l, mid);
	build(rid, mid + 1, r);
	pushup(tr[id], tr[lid], tr[rid]);
}
node query(int id, int l, int r){
	if (l > r) return (node){0, 0, 0, 0, 0, 0};
	if (l <= tr[id].l && tr[id].r <= r){
		return tr[id];
	}
	int mid = (tr[id].l + tr[id].r) / 2;
	if (r <= mid) return query(lid, l, r);
	else if (l > mid) return query(rid, l, r);
	node t;
	pushup(t, query(lid, l, mid), query(rid, mid + 1, r));
	return t;
}
int main(){ 
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int T;
	cin >> T;
	while (T--){
		cin >> n;
		for (int i = 1;i <= n;i++){
			cin >> a[i];
		}
		memset(tr, 0, sizeof tr);
		build(1, 1, n);
		
		cin >> q;
		while (q--){
			int l1, r1, l2, r2;
			cin >> l1 >> r1 >> l2 >> r2;
			if (l2 > r1){
				//cout << 1;
				cout << query(1, l1, r1).rmax + query(1, r1, l2).sum + query(1, l2, r2).lmax - a[r1] - a[l2] << '\n';
			}
			else{
				ll ans = query(1, l2, r1).sum;
				if (l1 < l2) ans = max(ans, query(1, l1, l2).rmax + query(1, l2, r2).lmax - a[l2]);
				if (r2 > r1) ans = max(ans, query(1, l1, r1).rmax + query(1, r1, r2).lmax - a[r1]);
				cout << ans << '\n';
			}
		}
	}
	return 0;
}
2024/1/21 22:16
加载中...