【急】求指明错误,并改正
查看原帖
【急】求指明错误,并改正
1070523
ybc2027_yangshoukuo楼主2024/4/2 15:18

全WA,样例下载下来是爆long long了(样例#1)

#include <bits/stdc++.h>
using namespace std;
const int N = 100005; //6
struct TAG {
	long long k, d;
} tag[4 * N];
long long n, m, tree[4 * N], a, b, c, d, e, z[N];
long long ls(long long k) {
	return k * 2;
}
long long rs(long long k) {
	return k * 2 + 1;
}
void up_update(long long rt) {
	tree[rt] = tree[ls(rt)] + tree[rs(rt)];
}
void add_tag(long long dl, long long dr, long long K, long long D, long long rt) {
	tag[rt].k += K;
	tag[rt].d += D;
	tree[rt] += (dr - dl + 1) * K + ((dr - dl + 1) * (dr - dl) / 2) * D;
}
void down_update(long long rt, long long l, long long r) {
	if (tag[rt].k != 0) {
		long long mid = (l + r) / 2;
		add_tag(l, mid, tag[rt].k, tag[rt].d, ls(rt));
		add_tag(mid + 1, r, tag[rt].k + (mid + 1 - r)*tag[rt].d, tag[rt].d, rs(rt));
		tag[rt].k = 0;
		tag[rt].d = 0;
	}
	return;
}
void begintree(long long l, long long r, long long rt) {
	tag[rt].k = 0;
	tag[rt].d = 0;
	if (l == r) {
		tree[rt] = z[l];
		return;
	}
	long long mid = (l + r) / 2;
	begintree(l, mid, ls(rt));
	begintree(mid + 1, r, rs(rt));
	up_update(rt);
	return;
}
void qj_num(long long dl, long long dr, long long l, long long r, long long K, long long D, long long rt) {
	if (l <= dl && dr <= r) {
		add_tag(dl, dr, K + (dl - l)*D, D, rt);
		return;
	}
	down_update(rt, dl, dr);
	long long mid = (dl + dr) / 2;
	if (l <= mid) qj_num(dl, mid, l, r, K, D, ls(rt));
	if (r > mid) qj_num(mid + 1, dr, l, r, K, D, rs(rt));
	up_update(rt);
	return;
}
long long print_num(long long dl, long long dr, long long l, long long r, long long rt) {
	if (l <= dl && dr <= r) {
		return tree[rt];
	}
	down_update(rt, dl, dr);
	long long mid = (dl + dr) / 2, res = 0;
	if (l <= mid) res += print_num(dl, mid, l, r, ls(rt));
	if (r > mid) res += print_num(mid + 1, dr, l, r, rs(rt));
	return res;
}
int main() {
	freopen("in.in","r",stdin);
	scanf("%lld%lld", &n, &m);
	for (int i = 1; i <= n; i++) scanf("%lld", &z[i]);
	begintree(1, n, 1);
	for (int i = 1; i <= m; i++) {
		scanf("%lld%lld", &a, &b);
		if (a == 1) {
			scanf("%lld%lld%lld", &c, &d, &e);
			qj_num(1, n, b, c, d, e, 1);
		} else {
			printf("%lld\n", print_num(1, n, b, b, 1));
		}
	}
	return 0;
}
2024/4/2 15:18
加载中...