本人太懒,但是遇到有意思的题又不想放过,所以下面只写思路没有代码。

持续更新中

最大最小

就是问你有多少个区间满足区间最大值是区间最小值的两倍。

乍一看不太可做,实际上是个二分。

枚举左端点,右端点变大的过程中,区间最大值不会变小,区间最小值不会变大,\(\frac{区间最大值}{区间最小值}\)不会变小,具有二分性。

HDU7073 Integers Have Friends

题目大意:给你一个数组,从里面尽可能多的选数,使得他们模m同余(m>=2)。问你最多能选出来几个。

这题竟然是随机化。。。

如果我们选m=2,可以得到一个大小为n/2的较优解(不一定是最优解),所以可知最优解的大小>=n/2。

我们随便选两个数,它们都在最优解里的概率>=1/4,不能同时在最优解的概率<=3/4,我们可以多选出来几对(假设是k对),这几对都同时不在最优解的概率<=\((\frac{3}{4})^k\),k足够大的时候\((\frac{3}{4})^k\),可以看似成0

对于选出来的两个数,把他们的差质因数分解,分解出来的质数分别看作m,O(n)处理一遍就行,取所有情况里面最大的集合就行。

CF1548B Integers Have Friends

题目大意:跟上面那个hud7073一样,不过这道题要求选的数是连续的

既然是要求选的数连续的,我们就能想到用双指针。

怎么找m?我之前有个比较nature的想法就是让所有的a减去\(a_1\),但很明显如果\(a_1\)如果不在最后的答案那个区间里的话这种做法是错误的。

实际上只用设\(b_i=a_{i+1}-a_i\),把双指针放在b上,然后快速求个gcd就行,快速求gcd用线段树和st表都行。