GSS5求调
查看原帖
GSS5求调
463210
zzzYheng楼主2021/8/13 17:47

Rt,能给我一组hack数据也行。

#include <bits/stdc++.h>
//#define int long long
const int Maxn = 1e5 + 10; 

int T; 
int n, m;
int val[Maxn];  

struct node {
	int sum; 
	int maxl, maxr; 
	int max_; 
} tree[Maxn << 2], Null;

int read() {
	int sum = 0, flag = 1; char ch = getchar(); 
	for (; (ch < '0' || ch > '9') && ch != '-'; ch = getchar()); 
	if (ch == '-') flag = -1, ch = getchar(); 
	for (; ch >= '0' && ch <= '9'; ch = getchar())
		sum = sum * 10 + ch - '0'; 
	return sum * flag; 
}

inline int lson(int x) {
	return x << 1; 
}

inline int rson(int x) {
	return x << 1 | 1; 
}

void push_up(int x) {
	tree[x].sum = tree[lson(x)].sum + tree[rson(x)].sum; 
	tree[x].maxl = std::max(tree[lson(x)].maxl, tree[lson(x)].sum + tree[rson(x)].maxl); 
	tree[x].maxr = std::max(tree[rson(x)].maxr, tree[rson(x)].sum + tree[lson(x)].maxr); 
	tree[x].max_ = std::max(std::max(tree[lson(x)].max_, tree[rson(x)].max_), tree[lson(x)].maxr + tree[rson(x)].maxl); 
}

void build(int now, int l, int r) {
	if (l > r) return; 
	if (l == r) {
		tree[now].sum = tree[now].maxl = tree[now].maxr = tree[now].max_ = val[l]; 
		return; 
	}
	int mid = l + r >> 1; 
	build(lson(now), l, mid); 
	build(rson(now), mid + 1, r); 
	push_up(now); 
}

node query(int now, int l, int r, int L, int R) {
	int mid = l + r >> 1; 
	if (L > R) return Null; 
	if (L <= l && r <= R) 
		return tree[now]; 
	else if (R <= mid)
		return query(lson(now), l, mid, L, R); 
	else if (mid < L)
		return query(rson(now), mid + 1, r, L, R); 
	else {
		node a, b, ans; 
		a = query(lson(now), l, mid, L, R); 
		b = query(rson(now), mid + 1, r, L, R); 
		ans.sum = a.sum + b.sum; 
		ans.maxl = std::max(a.maxl, a.sum + b.maxl); 
		ans.maxr = std::max(b.maxr, b.sum + a.maxr); 
		ans.max_ = std::max(std::max(a.max_, b.max_), a.maxr + b.maxl); 
		return ans; 
	}
}

signed main() {
	int i, j; 
	T = read(); 
	Null.sum = Null.maxl = Null.maxr = Null.max_ = 0; 
	while (T--) {
		n = read(); 
//		memset(tree, -0x3f, sizeof(tree)); 
		for (i = 1; i <= n; i++) {
			val[i] = read(); 
		}
		build(1, 1, n); 
		m = read(); 
		for (i = 1; i <= m; i++) {
			int x1, y1, x2, y2; 
			x1 = read(), y1 = read(), x2 = read(), y2 = read(); 
			if (y1 < x2) {
				printf("%d\n", query(1, 1, n, x1, y1 - 1).maxr 
				+ query(1, 1, n, y1, x2).sum 
				+ query(1, 1, n, x2 + 1, y2).maxl); 
			}
			else if (y2 < x1) {
				printf("0\n"); 
			}
			else if (x1 <= x2 && x2 <= y1 && y1 <= y2) {
				printf("%d\n", std::max(std::max(
				query(1, 1, n, x1, x2 - 1).maxr 
				+ query(1, 1, n, x2, y1).sum 
				+ query(1, 1, n, y1 + 1, y2).maxl, 
				query(1, 1, n, x2, y1).max_), 
				std::max(
				query(1, 1, n, x1, x2 - 1).maxr 
				+ query(1, 1, n, x2, y1).maxl, 
				query(1, 1, n, x2, y1 - 1).maxr
				+ query(1, 1, n, y1, y2).maxl))); 
			}
			else if (x2 <= x1 && x1 <= y2 && y2 <= y1) {
				printf("%d\n", std::max(std::max(
				query(1, 1, n, x2, x1 - 1).maxr 
				+ query(1, 1, n, x1, y2).sum 
				+ query(1, 1, n, y2 + 1, y1).maxl, 
				query(1, 1, n, x1, y2).max_), 
				std::max(query(1, 1, n, x2, x1 - 1).maxr 
				+ query(1, 1, n, x1, y2).maxl, 
				query(1, 1, n, x1, y2 - 1).maxr
				+ query(1, 1, n, y2, y1).maxl))); 
			}
			else if (x1 <= x2 && y2 <= y1) {
				printf("%d\n", std::max(query(1, 1, n, x2, y2).max_, 
				query(1, 1, n, x1, x2 - 1).maxr + query(1, 1, n, x2, y2).maxl)); 
			}
			else if (x2 <= x1 && y1 <= y2) {
				printf("%d\n", std::max(query(1, 1, n, x1, y1).max_, 
				query(1, 1, n, x1, y1 - 1).maxr + query(1, 1, n, y1, y2).maxl)); 
			}
		}
	}
	return 0; 
} 
2021/8/13 17:47
加载中...