MnZn 刚学线段树求助,为什么样例过不了?
查看原帖
MnZn 刚学线段树求助,为什么样例过不了?
912750
CarrotMeow楼主2023/4/17 17:25

rt,提交上去 2xWA + 8xRE qwq

#include <bits/stdc++.h>
using namespace std;

namespace newstd {
#define fo(i,a,b) for (auto i = a; i < b; i++)
#define foe(i,a,b) for (auto i = a; i <= b; i++)
#define of(i,b,a) for (auto i = b; i > a; i--)
#define ofe(i,b,a) for (auto i = b; i >= a; i--)
#define fi(i,s) for (auto i : s)
#define print(fmt, ...) printf(fmt, __VA_ARGS__), printf("\n") 
#define sq(x) ((x) * (x))
#define cb(x) (sq(x) * (x))
#define ks(s) (string(s))
#define ts(s) (to_string(s))
#define mem(s, a) memset(s, a, sizeof(s))
#define v1 first
#define v2 second

typedef const ssize_t constant;
typedef long long ll;
typedef __int128 lll;
typedef unsigned ui;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef pair<int, int> pii;

const int inf = 0x3f3f3f3f;
const ll inf_ll = 0x3f3f3f3f3f3f3f3fll;
constant _FREAD_SIZE = 0x10000;
char buf[_FREAD_SIZE], *p1 = buf, *p2 = buf;

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, _FREAD_SIZE, stdin), p1 == p2) ? EOF: *p1++)

template<class _Tp, constant __len> 
using arr = _Tp [__len];
template<class _Tp, constant __len, constant __len2> 
using arr2 = _Tp [__len][__len2];
template<class _Tp = ll>
inline _Tp read() {
    char c = getchar();
    _Tp x = 0;
    int f = 1;
    for(; !isdigit(c); c = getchar())
        if (c == '-') f *= -1;
    for(; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + (c - 48);
    return x * f;
}
template<class _Tp>
inline void read(_Tp &x) {
    x = read<_Tp>();
}
template<class _Tp, class ..._Up>
inline void read(_Tp &x, _Up &...__args) {
    read(x), read(__args...);
}
template<class _Tp> 
inline _Tp gcd(_Tp n, _Tp m) {return m ? gcd(m, n % m) : n;}
template<class _Tp>
inline _Tp lcm(_Tp n, _Tp m) {return n / gcd(n, m) * m;}
} // namespace
using namespace newstd;
/* =================== */

constant N = 1e5 + 10;
ll a[N], w[N << 2], z[N << 2];

void pushup(const int u) {
	w[u] = w[u << 1] + w[(u << 1) + 1];
}

void build(const int u, int l, int r) {
	if (l == r) {
		w[u] = a[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(u << 1, l, mid);
	build((u << 1) + 1, mid + 1, r);
	pushup(u);
}

ll query1(int u, int l, int r, int p) {
	if (l == r)
		return w[u];
	else {
		int mid = (l + r) >> 1;
		if (mid >= p)
			return query1(u << 1, l, mid, p);
		else
			return query1((u << 1) + 1, mid + 1, r, p);
	}
}

void update1(int u, int l, int r, int p, ll x) {
	if (l == r)
		w[u] = x;
	else {
		int mid = (l + r) >> 1;
		if (mid >= p)
			update1(u << 1, l, mid, p, x);
		else
			update1((u << 1) + 1, mid + 1, r, p, x);
		pushup(u);
	}
}

bool inrange(int l, int r, int l2, int r2) {
	return (l <= l2) && (r <= r2);
}

bool outrange(int l, int r, int l2, int r2) {
	return (l > r2) || (r < l2);
}

void maketag(int u, int l, ll x) {
	z[u] += x;
	w[u] += l * x;
}

void pushdown(int u, int l, int r) {
	int mid = (l + r) >> 1;
	maketag(u << 1, mid - l + 1, z[u]);
	maketag((u << 1) + 1, r - mid, z[u]);
	z[u] = 0;
}

ll query(int u, int l, int r, int l2, int r2) {
	if (inrange(l, r, l2, r2))
		return w[u];
	else if (!outrange(l, r, l2, r2)) {
		int mid = (l + r) >> 1;
		pushdown(u, l, r);
		return query(u << 1, l, mid, l2, r2)
			+ query((u << 1) + 1, mid + 1, r, l2, r2);
	} else return 0;
}

void update(int u, int l, int r, int l2, int r2, ll x) {
	if (inrange(l, r, l2, r2))
		maketag(u, r - l + 1, x);
	else if (!outrange(l, r, l2, r2)) {
		int mid = (l + r) >> 1;
		pushdown(u, l, r);
		update(u << 1, l, mid, l2, r2, x);
		update((u << 1) + 1, mid + 1, r, l2, r2, x);
		pushup(u);
	}
}

signed main() {
	int n = read(), m = read();
	foe (i, 1, n)
		read(a[i]);
	build(1, 1, n);
	foe (i, 1, m) {
		if (read() == 1)
			update(1, 1, n, read(), read(), read());
		else
			print("%lld", query(1, 1, n, read(), read()));
	}
}
2023/4/17 17:25
加载中...