社区讨论
救救孩子吧!!!
SP1716GSS3 - Can you answer these queries III参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mi86bihn
- 此快照首次捕获于
- 2025/11/21 09:20 4 个月前
- 此快照最后确认于
- 2025/11/21 09:20 4 个月前
一个多小时了,还没找到错误,样例未过……
CPP#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define MAXN 50010
#define INF 0x3f3f3f3f
struct node
{
int a[4][4];
}tr[MAXN << 2];
int n, m, l, r, opt;
int a[MAXN];
inline node mul(node a, node b)
{
node c;
memset(c.a, -INF, sizeof(c.a));
for (int i = 1; i <= 3; ++ i)
for (int j = 1; j <= 3; ++ j)
for (int k = 1; k <= 3; ++ k)
c.a[i][j] = max(a.a[i][k] * b.a[k][j], c.a[i][j]);
return c;
}
void upt(int rt)
{
tr[rt] = mul(tr[rt << 1], tr[rt << 1 | 1]);
}
void build(int rt, int l, int r)
{
if (l == r)
{
tr[rt].a[1][1] = tr[rt].a[1][3] = tr[rt].a[2][1] = tr[rt].a[2][3] = a[l];
tr[rt].a[1][2] = tr[rt].a[3][1] = tr[rt].a[3][2] = -INF;
tr[rt].a[2][2] = tr[rt].a[3][3] = 0;
return ;
}
int mid = (l + r) >> 1;
build(rt << 1, l, mid);
build(rt << 1 | 1, mid + 1, r);
upt(rt);
}
node query(int rt, int x, int y, int l, int r)
{
if (l <= x && y <= r)
return tr[rt];
int mid = (x + y) >> 1;
if (l <= mid && mid < r)
return mul(query(rt << 1, x, mid, l, r), query(rt << 1 | 1, mid + 1, y, l, r));
else
if (l <= mid)
return query(rt << 1, x, mid, l, r);
else
return query(rt << 1 | 1, mid + 1, y, l, r);
}
void modify(int rt, int l, int r, int pos, int v)
{
if (l == r)
{
tr[rt].a[1][1] = tr[rt].a[1][3] = tr[rt].a[2][1] = tr[rt].a[2][3] = v;
return ;
}
int mid = (l + r) >> 1;
if (pos <= mid)
modify(rt << 1, l, mid, pos, v);
else
modify(rt << 1 | 1, mid + 1, r, pos, v);
upt(rt);
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; ++ i)
scanf("%d", &a[i]);
build(1, 1, n);
scanf("%d", &m);
while (m --)
{
scanf("%d%d%d", &opt, &l, &r);
if (opt == 1)
{
if (l > r)
swap(l, r);
node ans = query(1, 1, n, l, r);
printf("%d\n", max(ans.a[2][1], ans.a[2][3]));
}
else
{
a[l] = r;
modify(1, 1, n, l, r);
}
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...