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\) 的必然不可能放到一组就很简单了

\[f[i,j]=f[i-1,j-1]+f[i-1,j]\times\max(j-\sum_{k=1}^{i-1}[a_{i}-a_{k}<r],0) \]

H. Shortest Path in GCD Graph

corner case:\(\gcd(u,v)=2\) 时直接走 \((u,v)\) 也是一条最短路

注意在计算质因子乘积时会爆 int

J. Sum Plus Product

\(\prod(a+1)\) 是定值

posted @ 2022-08-20 21:33  401rk8  阅读(55)  评论(1编辑  收藏  举报