【CodeForces - 438D】:The Child and Sequence【线段树+数论】

这是一篇关于CodeForces 438D问题的解析,主要讨论如何利用线段树解决区间操作(求和、取模、单点修改)的问题。通过分析,当mod小于等于序列中元素的一半时,每次取模会使数值至少减半,因此总操作次数不超过log次。因此,总复杂度为O(MlogAlogA)。
摘要由CSDN通过智能技术生成

题目:

CodeForces - 438D:The Child and Sequence

题意:

给定一个序列,有三种操作:(1)区间求和(2)区间对一个数取模(3)单点修改

分析:

这个题的难点在于区间取模,并没有什么好的方法能快速维护区间和,考虑暴力取模:

首先,只有 A[x] >= mod,取模操作才有意义,那么就可以维护区间最大值,去找到需要取模的数;这样暴力的复杂度如何呢?当 mod <= A[x]/2,那么有:A[x]%mod <= A[x]/2;当 mod > A[x]/2 时,又有 mod <= A[x],同样有:A[x]%mod <= A[x]/2;所以每取一次模,值最差都要减小一半,那么每个数最多操作 log 次;所以复杂度为O(MlogAlogA)

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
const int maxn = 2e5+15;
int n,m,op,x,l,r,k,a[maxn];
LL tr[maxn<<
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值