2018 ACM-ICPC 上海大都会 H A Simple Problem with Integers(level 4)(线段树+floyd判环+暴力)

题目链接

题意:

给你长度为n的数组,然后有q个操作,2种类型(n,q<=5e4)

1. C a b means performing Ai = (Ai2 mod 2018) for all Ai such that a ≤ i ≤ b.
2. Q a b means query the sum of Aa, Aa+1, ..., Ab. Note that the sum is not taken modulo 2018.

解析:

摘了讨论的一个题解

因为模数比较小,考虑自幂多次后会产生循环节。可以使用KMP算法和floyd判环(龟兔赛跑算法)辅助寻找循环节。

KMP可以求出循环长度。

floyd判环则更加强大,不但能求出循环圈的大小,并且能够区分循环部分与非循环的部分

本题使用floyd判环的模板帖进去会得到如下结论:

1、所有数字均会在多次自幂之后进入一个长度为6的循环节。

2、一开始有些数字一开始就在循环圈上,有些数字不在循环圈上。但是操作多次之后所有数字一定都会进入循环节,并且这个操作次数不多。

题解:

预处理将0到2017的数字分成两类,一类是在长度为6的循环节中的数字,另一类是不在循环节中的数字。

建一颗线段树,一开始暴力更新。一旦发现区间内所有的数字均进入长度为6的循环节时,就改为处理这6种循环的区间和。并且将修改操作从暴力修改改为懒标记下放。

时间复杂度O(6mlogn),空间复杂度O(n)

 龟兔赛跑算法   代码

kmp求循环节

下面是我打表的代码

#include<iostream>
#include<cstdio>
#include<c
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值