社区讨论
ABC G
学术版参与者 3已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @m0877eq7
- 此快照首次捕获于
- 2024/08/24 21:50 2 年前
- 此快照最后确认于
- 2024/08/25 09:48 2 年前
因为题目保证了 所以对于 只会执行 次。
所以暴力就好了,对于 的线段树上二分找到连续 1 的右端点。
但是 AC 10。
CPP#include<bits/stdc++.h>
#define int long long
#define For(i,a,b) for(i=a;i<=b;i++)
#define FOR(i,a,b) for(i=a;i>=b;i--)
#define o1 cout<<"Yes\n"
#define o0 cout<<"No\n"
using namespace std;
typedef pair<int, int> PII;
typedef unsigned short u16;
typedef unsigned int u32;
typedef unsigned long long u64;
typedef unsigned __int128 u128;
typedef short i16;
typedef int i32;
typedef long long i64;
typedef __int128 i128;
const int N = 1e5 + 10;
const i64 inf = 1e18;
int a[N], b[N];
struct BIT {
i64 tr[N];
int n;
void init(int n) {
this->n = n;
int i;
For(i, 1, n) tr[i] = 0;
}
int lowbit(int x) {
return x & (-x);
}
void update(int x, int v) {
for (; x <= n; x += lowbit(x)) tr[x] += v;
}
i64 query(int x) {
i64 res = 0;
for (; x; x -= lowbit(x)) res += tr[x];
return res;
}
} Bit1;
struct node {
int v, pos;
};
struct seg {
node tr[N << 2];
void push_up(int t) {
if (tr[t << 1].v) {
if (tr[t << 1 | 1].pos) tr[t] = tr[t << 1 | 1];
else tr[t] = tr[t << 1];
}
else tr[t] = tr[t << 1];
}
void update(int t, int l, int r, int x, int v) {
int mid = l + r >> 1;
if (l == r) {
tr[t].v = (v == 1);
if (tr[t].v) tr[t].pos = l;
else tr[t].pos = 0;
return ;
}
if (x <= mid) update(t << 1, l, mid, x, v);
else update(t << 1 | 1, mid + 1, r, x, v);
push_up(t);
}
node query(int t, int l, int r, int x, int y) {
int mid = l + r >> 1;
if (x <= l && r <= y) {
return tr[t];
}
if (x > mid) return query(t << 1 | 1, mid + 1, r, x, y);
if (y <= mid) return query(t << 1, l, mid, x, y);
node res1 = query(t << 1, l, mid, x, mid);
node res2 = query(t << 1 | 1, mid + 1, r, mid + 1, y);
if (res1.v) {
if (res2.pos) return res2;
return res1;
}
return res1;
}
} tree;
void solve() {
int i, j;
int n;
cin >> n;
For(i, 1, n) cin >> a[i];
For(i, 1, n) cin >> b[i];
For(i, 1, n) tree.update(1, 1, n, i, b[i]);
Bit1.init(n);
For(i, 1, n) Bit1.update(i, a[i]);
int m;
cin >> m;
while (m--) {
int op;
cin >> op;
if (op == 1) {
int x, v;
cin >> x >> v;
Bit1.update(x, -a[x]);
a[x] = v;
Bit1.update(x, a[x]);
}
if (op == 2) {
int x, v;
cin >> x >> v;
tree.update(1, 1, n, x, v);
b[x] = v;
}
if (op == 3) {
int l, r;
cin >> l >> r;
i64 v = 0;
For(j, l, r) {
if (b[j] == 1) {
auto now = tree.query(1, 1, n, j, r).pos;
v += Bit1.query(now) - Bit1.query(j - 1);
j = now;
}
else {
i64 res1 = v + a[j], res2 = v * b[j];
v = max(res1, res2);
}
}
cout << v << '\n';
}
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t;
// cin >> t;
t = 1;
while (t--) {
solve();
}
return 0;
}
回复
共 10 条回复,欢迎继续交流。
正在加载回复...