\(\text{Tricks}\),也许叫【一些神奇的小知识】更贴切?

有时候可以成为解题的关键。

虽然有点晚了但还是写一点比较好🤔

讲真,大概是写给未来的自己了。

也许会参加 ACM 吧?🤔

\(\text{1.}\ 判定等差数列\)

觉得判定等差数列大概很容易考于是写写。

暴力的思想是把数全部扔到 multiset 里然后循环判断,或者说数组记录 sort 一遍后判断。这样做是 \(O(n \log n)\) 的。

但是太慢了。

考虑优化暴力,可以类似莫队一样在数列上移动,用 multiset 实时维护(但好像快不了多少。。)。但是还是不够快。

\(\text{APJifengc}\) 大佬的博客 (密码是多校IP地址以及端口号)

性质:给定一个数列 \(A\),若排序后是一个等差数列,那么其公差即为 \(\gcd(|A_1 – A_2|, |A_2 – A_3|, …, A_{n-1} – A_n)\)

\(\text{APJ}\) 大佬说用扫描线一类的,但是我不会(

考虑一些简单的方法。注意到公差我们已经可以由上面的性质推出来了,此时我们要做的其实就是判断首项和末项是否合法。设公差为 \(d\),则需判断 \(a_n = a_1 + (r-l) \times d\)

此时还需要注意一个问题,判断序列中是否存在相同元素。这个可以转化为 \(\text{HH}\) 的项链,查区间不同元素个数是否等于区间长度。

目前此问题还没有解决,APJ说离线的话可以扫描线。

关于为何要判是否存在相同元素:1 3 5 9 3

关于为何是判相同元素而不是判一个区间加:4 2 4 10 12 10

\(\text{Hint}\):参考了这位大佬的博客以及 \(\text{APJifengc}\) 大佬的博客

\(\text{2.}\ 判定排列\)

对于给定的一个序列 a,若询问区间 \([l, r]\) 内的数构成的集合是否构成了从 \(1\) 开始的一个排列,线段树求一个最小和最大值,然后套求和公式再线段树求一个区间 sum 判断。

显然是假的。考虑 1 2 3 41 1 4 4

但是注意到 \(1 \times 2 \times 3 \times 4 \neq 1 \times 1 \times 4 \times 4\),于是可以再套一个查询区间乘积来判断。可以卡掉但是并不好卡,因为区间乘积需要取模,模数是自己定的,实在不行可以套一个双模(

预处理阶乘即可用区间乘判断。

但是如果要卡的话构造比较小的数据(小于模数)应该就能卡?

还有一种 \(\text{sandom}\) 教的判定方式,就是对于每个数用 map 映射一个随机值,处理一下1~i的排列 map 映射后的 sum,预处理 \(sum_i\)\(1 \sim i\) 映射后的和,怕溢出可以取模,然后到时候直接查区间 sum 看是不是就行了。有点像这道题

以及 \(\text{joke}\) 的判定方式,每个数的二次方与三次方。

原文地址:http://www.cnblogs.com/charphi/p/16897573.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性