社区讨论
TLE求调
SP2916GSS5 - Can you answer these queries V参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @m2ag95y5
- 此快照首次捕获于
- 2024/10/15 20:58 去年
- 此快照最后确认于
- 2024/10/15 22:18 去年
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e6 + 5;
struct treenode {
signed l, r, lmx, rmx, mx, sum;
treenode() {
mx = -1e9;
lmx = rmx = 0;
}
};
int a[maxn], sum[maxn];
#define x1 PANDORA_PARADOX
#define y1 PANDORA_PARADOXX
#define x2 PANDORA_PARADOXXX
#define y2 PANDORA_PARADOXXXX
struct SegTree {
private:
int lch(int p) {return (p << 1);}
int rch(int p) {return (p << 1) + 1;}
inline treenode query(int ql, int qr, int p) {
int l = tree[p].l, r = tree[p].r;
if (ql <= l && r <= qr) {
return tree[p];
}
int mid = (l + r) >> 1; treenode res;
if (ql <= mid) res = merge(res, query(ql, qr, lch(p)));
if (qr > mid) res = merge(res, query(ql, qr, rch(p)));
return res;
}
treenode tree[maxn * 4];
treenode merge(treenode l, treenode r) {
treenode res;
if (l.mx == -1e9) return r;
if (r.mx == -1e9) return l;
res.lmx = max(l.lmx, l.sum + r.lmx);
res.rmx = max(r.rmx, r.sum + l.rmx);
res.mx = max(max(l.mx, r.mx), l.rmx + r.lmx);
res.sum = l.sum + r.sum;
return res;
}
public:
void debug() {
for (int i = 1; i <= 20; ++i) {
cerr << tree[i].l << ' ' << tree[i].r << ' ' << tree[i].mx << ' ' << tree[i].lmx << ' ' << tree[i].rmx << endl;
}
cerr << "=============================\n";
}
inline void build(int l, int r, int p) {
tree[p].l = l, tree[p].r = r;
if (l == r) {
tree[p].lmx = tree[p].rmx = tree[p].mx = tree[p].sum = a[l];
return ;
}
int mid = (l + r) >> 1;
build(l, mid, lch(p));
build(mid + 1, r, rch(p));
tree[p] = merge(tree[lch(p)], tree[rch(p)]);
tree[p].l = l, tree[p].r = r;
}
int query_lmx(int ql, int qr) {
if (qr < ql) return 0;
return query(ql, qr, 1).lmx;
}
int query_rmx(int ql, int qr) {
if (qr < ql) return 0;
return query(ql, qr, 1).rmx;
}
int query_mx(int ql, int qr) {
if (qr < ql) return 0;
return query(ql, qr, 1).mx;
}
} T;
signed main() {
int z; cin >> z;
while (z--) {
int n, m; cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
sum[i] = sum[i - 1] + a[i];
}
T.build(1, n, 1);
cin >> m;
for (int i = 1; i <= m; ++i) {
int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2;
if (y1 < x2) {
cout << T.query_rmx(x1, y1) + T.query_lmx(x2, y2) + sum[x2 - 1] - sum[y1] << endl;
} else {
int ans = T.query_mx(x2, y1);
if (x1 < x2) ans = max(ans, T.query_rmx(x1, x2) + T.query_lmx(x2, y2) - a[x2]);
if (y1 < y2) ans = max(ans, T.query_rmx(x1, y1) + T.query_lmx(y1, y2) - a[y1]);
cout << ans << endl;
}
}
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...