【COCI 2009】ALADIN

该博客介绍了COCI 2009年ALADIN问题的解决方案,涉及序列修改和区间求和。博主通过将取模运算转换形式,利用数论技巧和几何直观将问题转化为求解三角形内整点数量。通过分类讨论A与B的关系,结合欧几里得算法,实现了O(nlog2n)的时间复杂度解法,强调了数论知识和线段树在处理这类问题中的应用。

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

题目大意

要求维护一个长度为n的序列,有两种操作,共m个询问。

  1. 将区间[l,r)上的数进行修改,位置i上的数改为iAmodB
  2. 询问区间[l,r)上的数的和。

其中n<=109,m<=105


分析

注意这里是将数模了,询问总和时不模。
离散化以后套个线段树就可以处理好两种询问,问题在于怎么求这样一个东西。

ni=0(iAmodB)

考虑将取模转换一下形式。

ni=0(iAmodB)=Ani=0iBni=0iAB

左边的很好算,主要看右边的取整求和部分。
几何化地理解一下,实际上它求的是一个以(0,0),(n,0),(n,nAB)为顶点的三角形内或边缘上的整点数目(不考虑落在坐标轴上的底边)。
不妨分类讨论。
A>B,则A可以写成A=kB+r,其中k,r都是非负整数。
那么就有

ni=0iAB=ni=0i(kB+r)B=ni=0irB+kni=0i

那么就转化为了A<B的情况。
对于这种情况我们不妨反过来算,算矩形点数减去上三角形点数来得到下三角形点数,设nAB=m

ni=0iAB=nmmi=0iBA+diagonal

其中diagonal代表落在对角线上的整点,它的值是ngcd(A,B)B。因为这条直线必定过点(B,A),而它与(1,1)形成的线段上有gcd(A,B)个整点,每个整点的横坐标之间差了Bgcd(A,B)个单位,于是n个单位再除一下就好了。

注意到我们的问题转化为了求mi=0iBA,也就是说AB调换了位置,那么又转化回了A>B的问题。这样子类似于欧基里德算法地计算,时间复杂度是O(logn)

然后剩下的就是简单的线段树维护了。
总时间复杂度O(nlog2n)


后记

要注意取模转化的技巧,以及数论知识的运用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值