联合省选 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]);
}

T3 uoj823 【UR #26】铁轨回收

posted @ 2026-03-05 14:28  TallBanana  阅读(57)  评论(0)    收藏  举报