社区讨论

ABC G

学术版参与者 3已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@m0877eq7
此快照首次捕获于
2024/08/24 21:50
2 年前
此快照最后确认于
2024/08/25 09:48
2 年前
查看原帖
因为题目保证了 ans1018ans≤10^{18} 所以对于 bi>1bi>1 只会执行 60≤60 次。
所以暴力就好了,对于 bi=1bi=1 的线段树上二分找到连续 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 条回复,欢迎继续交流。

正在加载回复...