题解 [LuoguP4588][TJOI2018] 数学计算

本文介绍了如何使用线段树数据结构解决[TJOI2018]题目中的数学计算问题,涉及对线段树的操作,包括修改特定位置的值和查询根节点结果。通过时间轴建树,处理111和222操作,展示了如何维护和更新数据结构以高效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题解 [LuoguP4588][TJOI2018] 数学计算

link

属于是没有区间的线段树了。

以时间为轴建线段树,如果第 i i i 个操作是 1 1 1,把第 i i i 位乘上 m m m;如果是 2 2 2,把第 m m m 位改为 1 1 1

查询就直接输出根节点。

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

const int N = 1e5;
int t, Q, op; long long M, T[N<<2], m;

void modify(int p, int L, int R, int x, long long v){
	if(L == R) T[p] = v ? T[p] * v % M : 1;
	else {
		int mid = L + R >> 1;
		if(x <= mid) modify(p<<1, L, mid, x, v);
		else modify(p<<1|1, mid+1, R, x, v);
		T[p] = (T[p<<1] * T[p<<1|1]) % M;
	}
}

int main(){
	scanf("%d", &t);
	while(t--){
		for(int i = 1; i < N<<2; ++ i) T[i] = 1;
		scanf("%d%lld", &Q, &M);
		for(int i = 1; i <= Q; ++ i){
			scanf("%d%lld", &op, &m);
			if(op == 1) modify(1, 1, Q, i, m);
			else modify(1, 1, Q, m, 0);
			printf("%lld\n", T[1]);
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值