【急】求助
  • 板块学术版
  • 楼主小坦克
  • 当前回复9
  • 已保存回复9
  • 发布时间2021/7/25 10:40
  • 上次更新2023/11/4 13:23:25
查看原帖
【急】求助
255199
小坦克楼主2021/7/25 10:40
  • 题目描述 ::

你在玩一个游戏,主持人给了你一个长度为 nn 的序列 AA,然后对这序列进行了 mm 次操作或询问 ::

  1. (( 11 ll rr xx )) :: 将区间上 [[ ll ,, rr ]] 内所有元素的值设为 xx
  2. (( 22 ll rr xx )) :: 将区间上 [[ ll ,, rr ]] 内所有元素的值加上 xx
  3. (( 33 ll rr xx )) :: 将区间上 [[ ll ,, rr ]] 内所有元素的值乘上 xx
  4. (( 44 ll rr )) :: 询问区间 [[ ll ,, rr ]] 所有元素的和对 pp 取模的结果
  • 代码 ::
#include <bits/stdc++.h>
using namespace std;

const int N = 100000 + 7;
const int T = N * 4;

int a[N], sum[T];
int n, m, p;

void pushup(int rt) {
	sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}

void build(int l, int r, int rt) {
	if(l == r) {
		sum[rt] = a[l];
		return;
	}
	int mid = l + r >> 1;
	build(l, mid, rt << 1);
	build(mid + 1, r, rt << 1 | 1);
	pushup(rt);
}

void update1(int L, int R, int C, int l, int r, int rt) {
	if(L <= l && r <= R) {
		sum[rt] = C;
		return;
	}
	int mid = l + r >> 1;
	if(L <= mid) update1(L, R, C, l, mid, rt << 1);
	else update1(L, R, C, mid + 1, r, rt << 1 | 1);
	pushup(rt);
}

void update2(int L, int R, int C, int l, int r, int rt) {
	if(L <= l && r <= R) {
		sum[rt] += C;
		return;
	}
	int mid = l + r >> 1;
	if(L <= mid) update2(L, R, C, l, mid, rt << 1);
	else update2(L, R, C, mid + 1, r, rt << 1 | 1);
	pushup(rt);
}

void update3(int L, int R, int C, int l, int r, int rt) {
	if(L <= l && r <= R) {
		sum[rt] *= C;
		return;
	}
	int mid = l + r >> 1;
	if(L <= mid) update3(L, R, C, l, mid, rt << 1);
	else update3(L, R, C, mid + 1, r, rt << 1 | 1);
	pushup(rt);
}

int query(int L, int R, int l, int r, int rt) {
	if(L <= l && r <= R) return sum[rt];
	int mid = l + r >> 1;
	int ans = 0;
	if(L <= mid) ans += query(L, R, l, mid, rt << 1) % p;
	if(R > mid) ans += query(L, R, mid + 1, r, rt << 1 | 1) % p;
	return ans % p;
}

int main() {
	
	scanf("%d%d%d", &n, &m, &p);
	for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
	
	build(1, n, n);
	
	while(m--) {
		int c, l, r, x;
		scanf("%d%d%d", &c, &l, &r);
		
		if(c == 1) {
			scanf("%d", &x);
			update1(l, r, x, 1, n, n);
		}
		
		else if(c == 2) {
			scanf("%d", &x);
			update2(l, r, x, 1, n, n);
		}
		
		else if(c == 3) {
			scanf("%d", &x);
			update3(l, r, x, 1, n, n);
		}
		
		else printf("%d", query(l, r, 1, n, n));
	}
	
	return 0;
}

当输入 ::

10 3 11
3 4 6 4 8 1 2 9 5 7
1 3 4 5
2 2 8 10
4 4 9

时,不应该输出 33 吗?

2021/7/25 10:40
加载中...