BZOJ 3509

发布时间 2023-09-19 20:22:52作者: zzafanti

题目链接

description

给定一个长度为 \(n\) 的数组 \(a\),求有多少对 \(i,j,k(1\leq i<j<k\leq n)\) 满足 \(a_k-a_j=a_j-a_i\)

\(n\leq 10^5\)

值域大小 3e4.

solution

三个数,看起来就不好用数据结构维护。

\(2a_j=a_i+a_k\) 可以当做多项式两项的指数相加得到指数为 \(2a_j\) 的项。由于 \(i,j,k\) 有大小顺序,不好直接构造多项式统计,也难分治做。

由于序列长度只有 \(1e5\) 直接分块。对于 \(i,j,k\) 中至少两个在同一个块中的情况,不难 \(O(n\sqrt{n})\) 枚举得到它们对答案的贡献。

然后考虑 \(i,j,k\) 不在同一个块中的情况。设 \(belong(x)\) 表示 \(x\) 所在的块从左往右的编号。枚举块编号 \(t\),构造多项式 \(A(x)=\sum \sum\limits_{belong(p)<t} [a_p=i] x^i\) 以及 \(B(x)=\sum \sum\limits_{belong(p)>t} [a_p=i] x^i\)。计算他们的乘积。然后扫描块 \(t\) 中的元素 \(a_i\),将多项式乘积的次数为 \(2a_i\) 的项的系数加到答案中即可。

时间复杂度 \(O(m\sqrt{n}+n\sqrt{n})\)\(m\) 是值域大小。

code

参考代码链接:BZOJ By Hydro OJ