hdu2022多校9
A. Arithmetic Subsequence
注意到等差数列加减乘除上同一个数仍是等差数列,这为分治提供了可能
把所有数按奇偶分开,那么不会有跨过两边的等差数列。把偶数除以 \(2\),奇数减 \(1\) 再除以二递归即可。时间复杂度 \(O(n\log a)\)
这个构造过程证明了只要不存在三个相同数就有解。注意递归边界是长度 \(\le2\)(两个数相同)
C. Fast Bubble Sort
ycx 做法:离线。倒序扫序列,维护单增栈,如果栈中两个元素位置相邻那么合并成一个(对答案只贡献 \(1\)),弹栈时再把合并的拆开。单调栈上二分出询问区间中元素个数就是答案
F. Mario Party
关键性质:\(\sum|a|\le10^{6}\)
分块
对于每个块,设 \(s=\sum|a|\),预处理值 \(0\le i<s\) 进入块后出来会变成多少。对于值 \(i\ge s\),在块中一定不会触发 \(a_{i}+x<0\),直接加上块内 \(a\) 的和即可。时间复杂度 \(O(\sum|a|\sqrt{n})\),非常好写
倍增
找到所有关键点 \((i,j)\):到达 \(i\) 时值为 \(j\) 且满足 \(a_{i}+j<0\)(只有 \(\sum|a|\) 个)。预处理关键点的倍增数组:到达一个关键点后下一个关键点是谁
剩下的问题是求 当前在 \(i\)、值为 \(x\) 的下一个关键点。记 \(a\) 的前缀和为 \(b\),等价于求最小的 \(j\) 满足 \(x+b_{j}-b_{i}<0\),离线倒序,在 \(b\) 的单调栈上二分即可
G. Matryoshka Doll
设 \(f[i,j]\) 为前 \(i\) 个数分 \(j\) 组的方案数,从 \(f[i-1,j]\) 转移需要知道有多少组末尾 \(\le a_{i}-r\),注意到 \(>a_{i}-r\) 的必然不可能放到一组就很简单了
H. Shortest Path in GCD Graph
corner case:\(\gcd(u,v)=2\) 时直接走 \((u,v)\) 也是一条最短路
注意在计算质因子乘积时会爆 int
J. Sum Plus Product
\(\prod(a+1)\) 是定值