联合省选 R8
https://cplusoj.com/d/senior/contest/69a810241363e1a07696d04f
T1 Baekjoon23674 Balanced Rainbow Sequence
ori: https://www.acmicpc.net/problem/23674
T2
半在线 OR 卷积板子。复杂度 \(O(n2^nm^2)\)。
形如 \(F_s=\sum_{t\subset s} F_{t}G_{s\setminus t}\)。
考虑现在做 \(\mathbf{solve}(l,r,k)\),表示 \(r-l+1=2^k\)。
现在有一个数组 \(A\) 表示 \([0,l)\) 贡献的 \(\mathtt{FWT}(F)\),数组 \(B\) 表示当前区间内的 \(\mathtt{FWT}(F)\)。
那么先做一次 \(2^{k-1}\) 上的 IFWT,然后递归 \(\mathbf{solve}(l,mid,k-1)\) 得到 \(F_{l,mid},B_{l,mid}\)。
更新:\(A_{x+2^{k-1}}\leftarrow A_{x+2^{k-1}}+B_x(G'_{x+2^{k-1}}-G'_{x})\)。
然后递归 \(\mathbf{solve}(mid+1,r,k-1)\),并对 \(B\) 做 \(2^{k-1}\) 上的 FWT。
其中 \(G'\) 是做过 FWT 的数组。
void solve(LL l,LL r,LL k)
{
if(l==r)
{
if(l) f[l]=mulV(A[l],e[l]);
return B[l]=f[l],void();
}
LL mid=(l+r)>>1;
for(int i=mid+1;i<=r;i++) delV(A[i],A[i-k]);
solve(l,mid,k>>1);
for(int i=mid+1;i<=r;i++) addM(A[i],mulV(B[i-k],delM(g[i],g[i-k])));
solve(mid+1,r,k>>1);
for(int i=mid+1;i<=r;i++) addM(B[i],B[i-k]);
}
浙公网安备 33010602011771号