求助为什么需要开8倍空间才过?
查看原帖
求助为什么需要开8倍空间才过?
393190
aldol_reaction楼主2021/5/2 08:05

开4倍会RE三个点,但是我看绝大多数人都是开的四倍,应该是我哪里写的有点问题,但是我找不出来,肯求大佬解惑

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<stack>
#include<set>
#define NDEBUG
#include <assert.h>
using namespace std;
typedef vector<int> vi;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;

inline int read() {
	int x = 0, f = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9') {
		if(ch == '-') f = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9') {
		x = (x << 1) + (x << 3) + (ch ^ 48);
		ch = getchar();
	}
	return x * f;
}

#define endl '\n'
#define rd read()
#define pb push_back
#define mst(a, b) memset((a), (b), sizeof(a));
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f3f
#define maxn 100005
#define ls (u << 1)
#define rs (u << 1 | 1)

int n, m, k, mod;

struct tree {
	ll x, lazym = 1, lazya;
} t[maxn << 3];

void pushup(int u) {
	t[u].x = t[ls].x + t[rs].x;
}

void build(int u, int l, int r) {
	if(l == r) {t[u].x = rd; return;}
	int mid = (l + r) >> 1;
	build(ls, l, mid);
	build(rs, mid + 1, r);
	pushup(u);
}

void pushdown(int u, int l, int r) {
	int mid = (l + r) >> 1;
	t[ls].x = (t[u].lazym * t[ls].x + (ll)t[u].lazya * (mid - l + 1)) % mod;
	t[rs].x = (t[u].lazym * t[rs].x + (ll)t[u].lazya * (r - mid)) % mod;
	t[ls].lazym = t[ls].lazym * t[u].lazym % mod;
	t[rs].lazym = t[rs].lazym * t[u].lazym % mod;
	t[ls].lazya = (t[ls].lazya * t[u].lazym % mod + t[u].lazya) % mod;
	t[rs].lazya = (t[rs].lazya * t[u].lazym % mod + t[u].lazya) % mod;
	t[u].lazym = 1, t[u].lazya = 0;
}

void upd1(int u, int l, int r, int x, int y, int d) {
	if(x <= l && r <= y) {
		if(t[u].lazya) pushdown(u, l, r);
		t[u].x = (t[u].x * d) % mod;
		t[u].lazym = (t[u].lazym * d) % mod;
		return;
	}
	pushdown(u, l, r);
	int mid = (l + r) >> 1;
	if(x <= mid) upd1(ls, l, mid, x, y, d);
	if(y > mid)  upd1(rs, mid + 1, r, x, y, d);
	pushup(u);
}

void upd2(int u, int l, int r, int x, int y, int d) {
	if(x <= l && r <= y) {
		t[u].x = (t[u].x + (ll)d * (r - l + 1) % mod) % mod;
		t[u].lazya = (t[u].lazya + d) % mod;
		return;
	}
	pushdown(u, l, r);
	int mid = (l + r) >> 1;
	if(x <= mid) upd2(ls, l, mid, x, y, d);
	if(y > mid)  upd2(rs, mid + 1, r, x, y, d);
	pushup(u);
}

ll query(int u, int l, int r, int x, int y) {
	if(x <= l && r <= y) return t[u].x;
	pushdown(u, l, r);
	ll t1 = 0, t2 = 0;
	int mid = (l + r) >> 1;
	if(x <= mid) t1 = query(ls, l, mid, x, y);
	if(y > mid)  t2 = query(rs, mid + 1, r, x, y);
	return (t1 + t2) % mod;
}

int main() {
#ifndef ONLINE_JUDGE
	freopen("D:\\Chrome Downloadings\\input.txt", "r", stdin);
	freopen("D:\\Chrome Downloadings\\output.txt", "w", stdout);
#endif
	cin >> n >> m >> mod;
	build(1, 1, n);
	while(m--) {
		int op = rd, p = rd, q = rd;
		if(op == 1) {
			int k = rd;
			upd1(1, 1, n, p, q, k);
		} else if(op == 2) {
			int k = rd;
			upd2(1, 1, n, p, q, k);
		} else if(op == 3) {
			printf("%lld\n", query(1, 1, n, p, q));
		}
	}














	return 0;
}

2021/5/2 08:05
加载中...