社区讨论

不过样例求条

P4314CPU 监控参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mjmpr5nx
此快照首次捕获于
2025/12/26 18:13
2 个月前
此快照最后确认于
2025/12/26 21:16
2 个月前
查看原帖
RT,悬一关。
CPP
#include<bits/stdc++.h>
#define endl '\n'
// #define MSOD

using namespace std;
using ll = long long;

constexpr ll N = 1e5 + 5, INF = 1e13;

struct MXT {
	int n, m;
	ll a[3][3];
	inline friend MXT operator * (MXT x, MXT y) {
		MXT res;
		res.n = x.n, res.m = y.m;
		for(int i = 0 ; i < x.n ; i ++) {
			for(int j = 0 ; j < y.m ; j ++) {
				res.a[i][j] = -INF;
				for(int k = 0 ; k < x.m ; k ++) {
					res.a[i][j] = max(res.a[i][j], x.a[i][k] + y.a[k][j]);
				}
			}
		}
		return res;
	}
	inline friend MXT operator + (MXT x, MXT y) {
		for(int i = 0 ; i < x.n ; i ++) {
			for(int j = 0 ; j < x.m ; j ++) {
				x.a[i][j] = max(x.a[i][j], y.a[i][j]);
			}
		}
		return x;
	}
} B1, B2;
int n;
ll b[N];
struct SGT {
	bool ok;
	MXT val, tg;
} t[N << 2];
#define ls (p << 1)
#define rs (p << 1 | 1)
inline void pushup(int p) {
	return t[p].val = t[ls].val + t[rs].val, void();
}
inline void lazy(int p, MXT d) {
	if(t[p].ok) {t[p].tg = t[p].tg * d;}
	else {t[p].tg = d;}
	t[p].val = t[p].val * d, t[p].ok = true;
	return;
}
inline void pushdown(int p) {
	if(t[p].ok) {
		t[p].ok = false;
		lazy(ls, t[p].tg), lazy(rs, t[p].tg);
	}
	return;
}
inline void build(int p, int pl, int pr) {
	t[p].ok = false, t[p].tg.n = t[p].tg.m = 3, t[p].val.n = 1, t[p].val.m = 3;
	if(pl == pr) {
		t[p].val.a[0][0] = b[pl], t[p].val.a[0][1] = b[pl], t[p].val.a[0][2] = 0;
	} else {
		int mid = (pl + pr) >> 1;
		build(ls, pl, mid);
		build(rs, mid + 1, pr);
		pushup(p);
	}
	return;
}
inline void upd(int p, int pl, int pr, int l, int r, MXT d) {
	if(l <= pl && pr <= r) {
		lazy(p, d);
	} else {
		int mid = (pl + pr) >> 1;
		pushdown(p);
		if(l <= mid) {
			upd(ls, pl, mid, l, r, d);
		}
		if(r > mid) {
			upd(rs, mid + 1, pr, l, r, d);
		}
		pushup(p);
	}
	return;
}
inline MXT qry(int p, int pl, int pr, int l, int r) {
	if(l <= pl && pr <= r) {
		return t[p].val;
	} else {
		int mid = (pl + pr) >> 1;
		pushdown(p);
		if(l <= mid && r > mid) {
			return (qry(ls, pl, mid, l, r) + qry(rs, mid + 1, pr, l, r));
		} else if(l <= mid) {
			return qry(ls, pl, mid, l, r);
		} else {
			return qry(rs, mid + 1, pr, l, r);
		}
	}
}
inline void solve()	{
	cin>>n;
	for(int i = 1 ; i <= n ; i ++) {
		cin>>b[i];
	}
	build(1, 1, n);
	B1.n = B1.m = B2.n = B2.m = 3;
	B1.a[0][0] = B1.a[0][1] = B1.a[0][2] = B1.a[1][0] = B1.a[1][2] = -INF;
	B2.a[0][2] = B2.a[1][0] = B2.a[1][2] = B2.a[2][0] = B2.a[2][1] = -INF;
	int q;
	cin>>q;
	while(q --) {
		int l, r;
		char op;
		cin>>op>>l>>r;
		if(op == 'Q') {
			cout<<qry(1, 1, n, l, r).a[0][0]<<endl;
		} else if(op == 'A') {
			cout<<qry(1, 1, n, l, r).a[1][0]<<endl;
		} else if(op == 'P') {
			ll z;
			cin>>z;
			B2.a[0][0] = B2.a[0][1] = z;
			upd(1, 1, n, l, r, B2);
		} else if(op == 'C') {
			ll z;
			cin>>z;
			B1.a[2][0] = B1.a[2][1] = z;
			upd(1, 1, n, l, r, B1);
		}
	}
	return;
}

signed main() {
	ios::sync_with_stdio(false), cout.tie(0), cin.tie(0);
	int TC = 1;
#ifdef MSOD
	cin>>TC;
#endif
	while(TC --) {
		solve();
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...