复健打的优美线段树全WA求调
  • 板块灌水区
  • 楼主hjqhs
  • 当前回复4
  • 已保存回复5
  • 发布时间2024/8/6 21:27
  • 上次更新2024/8/6 22:58:51
查看原帖
复健打的优美线段树全WA求调
724988
hjqhs楼主2024/8/6 21:27

P3372 十点全WA

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i, a, b) for(int i = (a); i <= (b); ++ i)
#define per(i, a, b) for(int i = (a); i >= (b); -- i)
typedef long long ll;
typedef unsigned long long ull;
const int N = 100005;
const int INF = 0x3f3f3f3f;
int n, m, a[N];
struct sgt { int sum, add; } t[N << 2];
int ls(int rt) { return rt << 1; }
int rs(int rt) { return rt << 1 | 1; }
void pushup(int rt) { t[rt].sum = t[ls(rt)].sum + t[rs(rt)].sum; }
void build(int rt, int l, int r) {
	t[rt].add = t[rt].sum = 0;
	if(l == r) return t[rt].sum = a[l], void();
	int mid = (l + r) >> 1;
	build(ls(rt), l, mid), build(rs(rt), mid + 1, r);
	pushup(rt);
}
void maketag(int rt, int l, int r, int v) {
	t[rt].add += v;
	t[rt].sum += v * (r - l + 1);
}
void pushdown(int rt, int l, int r) {
	if(!t[rt].add) return;
	int mid = (l + r) >> 1;
	maketag(ls(rt), l, mid, t[rt].add);
	maketag(rs(rt), mid + 1, r, t[rt].add);
	t[rt].add = 0;
}
void update(int updl, int updr, int rt, int l, int r, int k) {
	if(updl <= l && r <= updr) return maketag(rt, l, r, k), void();
	pushdown(rt, l, r);
	int mid = (l + r) >> 1;
	if(updl <= mid) update(updl, updr, ls(rt), l, mid, k);
	if(mid < updr) update(updl, updr, rs(rt), mid + 1, r, k);
}
int query(int qryl, int qryr, int rt, int l, int r) {
	if(qryl <= l && r <= qryr) return t[rt].sum;
	int res = 0, mid = (l + r) >> 1;
	pushdown(rt, l, r);
	if(qryl <= mid) res += query(qryl, qryr, ls(rt), l, mid);
	if(mid < qryr) res += query(qryl, qryr, rs(rt), mid + 1, r);
	return res;
}
void solve() {
	cin >> n >> m; rep(i, 1, n) cin >> a[i];
	build(1, 1, n);
	rep(_, 1, m) {
		int op; cin >> op;
		if(op == 1) {
			int x, y, k; cin >> x >> y >> k;
			update(x, y, 1, 1, n, k);
		} else if(op == 2) {
			int x, y; cin >> x >> y;
			cout << query(x, y, 1, 1, n) << '\n';
		}
	}
	return;
}
signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int T = 1;
	// cin >> T;
	while(T --) solve();
	return 0;
}
2024/8/6 21:27
加载中...