首页 > 其他分享 >浅记高维前缀和

浅记高维前缀和

时间:2024-03-19 22:56:12浏览次数:31  
标签:subset 前缀 复杂度 超集 子集 浅记 高维

考虑如下问题:
记 \(y\subset x\leftrightarrow x\& y=y\)。若 \(x\subset y\),称 \(x\) 为 \(y\) 的一个子集,\(y\) 为 \(x\) 的一个超集。
给定数组 \(f\),求数组 \(g\)。其中 \(g_x=\sum_{y\subset x}{f_y}\)。
设 \(f\) 中最大的数二进制下共有 \(n\) 位。
如果直接枚举子集的话,时间复杂度为 \(O(3^n)\),可以优化。
不妨考虑如下算法:

for(int i=0;i<n;i++){
    for(int j=0;j<1<<n;j++){
        if(!(j&1<<i)) f[j|1<<i]+=f[j];
    }
}

这个算法把 \(n\) 位的二进制数视作一个 \(n\) 维的每维为 \(0\) 或 \(1\) 的向量,整个过程是在对整个 \(n\) 维空间做前缀和。
具体一点,就是依次对于 \(0\sim n-1\) 维,把所有这一维是 \(0\) 的向量的前缀和累到 \(1\) 上。
正确性:
若 \(x\subset y\),则在 \(x\) 和 \(y\) 最高的不同的一维会算到 \(x\),在更低的位由于有高位不同不会算到。
若 \(x\not\subset y\),因为所有能算到 \(x\) 的向量都是将 \(x\) 的某些维从0变成 1 得到的(相当于能算到 \(x\) 的都是 \(x\) 的超集),
而至少存在某一维 \(x\) 为1,\(y\)为0,所以 \(y\)不可能算到x
时间复杂度\(O(2^nn)\),空间复杂度\(O(2^n)\)。

例题:CF449D
给出 \(n\) 个数\(a_1,a_2,...,a_n\),求有多少个非空子集,其中所有数与起来等于零。
设 \(f_x\) 表示 \(x\) 出现次数,用刚讲的高维前缀和方法算出 \(g_x=\sum_{y\subset x}{f_y}\)。
发现与起来为 \(x\) 的超集的子集个数很好算,即 \(2^{g_x}-1\)。
设与起来恰为 \(x\) 的子集个数为 \(h_x\)。令\(s_x=2^{g_x}-1\),不难发现将 \(s\) 做高维前缀和的逆变换即得到 \(h\),这个过程有点像容斥。

for(int i=0;i<n;i++){
    for(int j=0;j<1<<n;j++){
        if(j&1<<i) s[j^1<<i]-=s[j];
    }
}

答案即为 \(h_0\)。

标签:subset,前缀,复杂度,超集,子集,浅记,高维
From: https://www.cnblogs.com/studentDL/p/18084171

相关文章

  • 二维前缀和&二维差分(超详细,python版,其他语言也很轻松能看懂)
    上一篇文章讲解了一维前缀和&一维差分,本篇进阶为二维。二维前缀和:二维前缀和跟一维前缀和求法相同,这里直接上例子。数组a=[[1,2,2,1],[3,2,2,1],[1,1,1,1]]a数组如图:则数组a的前缀和为:数组b[[1,3,5,6],[4,8,12,14],[5,10,15,18]]b数组如图:前缀和递推公式为b[i][......
  • abc250E 判断集合前缀是否相等
    给定数组A[n]和B[n],有Q组询问,每次给出一组(x,y),问A中前x个元素构成的集合是否与B中前y个元素构成的集合相等?1<=n,q<=2e5;1<=a[i],b[i]<=1e9;1<=x[i],y[i]<=n可以用乘法和异或来实现对集合的哈希,另外需要借助一个set来避免重复元素对哈希结果的影响。#include<bits/stdc++.h>......
  • mysql索引(索引失效,遵循最左前缀,使用1.全值匹配 2.覆盖索引,失效:索引加函数,范围查询右边
    1.遵循联合索引最左列原则当表中创建了一个联合索引idx_name_age_position案例演示1.当我们在执行sql语句:以name为where条件时,我们可以用到索引EXPLAINSELECT*FROMemployeesWHEREname='LiLei';2.当我们在执行sql语句:以age为where条件时,索引就会失效......
  • 前缀和与差分
    前缀和:模版题:https://www.luogu.com.cn/problem/P8218二维前缀和:https://www.luogu.com.cn/problem/P2004前缀和应用:https://www.luogu.com.cn/problem/T430521前缀和应用二:https://www.luogu.com.cn/problem/T430522方法一:计算所有k的前缀和,要点:使用vector,效率nlogn其他......
  • [Python初阶]2255.统计是给定字符串前缀的字符串数目
    目录     2255.统计是给定字符串前缀的字符串数目①.题目②.问题分析③.startswith()方法理解与说明Ⅰ.定义和用法 Ⅱ.语法 ④.问题解决⑤总结     2255.统计是给定字符串前缀的字符串数目①.题目②.问题分析需求:统计列表words中,是字......
  • Leecode 最长公共前缀
    Day1刷题此题没有写出来,仅附上力扣官方代码:classSolution{publicStringlongestCommonPrefix(String[]strs){if(strs==null||strs.length==0){return"";}Stringprefix=strs[0];intcount=strs.length;......
  • 二维前缀和知识讲解+例题
    1.二维前缀和二维前缀和是一种数组处理技术,它在处理二维数据(如矩阵)时非常有用。它的概念源自于一维前缀和,但扩展到了两个维度。二维前缀和的主要思想是将矩阵中的每个元素与其上方和左方的元素进行累加,从而快速计算出矩阵中任意子矩阵的元素和。定义如下:设有一个二维矩阵......
  • 14. 最长公共前缀c
    char*longestCommonPrefix(char**strs,intstrsSize){intindex=1,min=INT_MAX;if(strsSize==1)returnstrs[0];while(index<strsSize){inti=0;while(strs[index-1][i]!=0&&strs[index][i]!=0&&strs[index-1][......
  • 2024/3/13打卡壁画——思维!!!+前缀和***
    目录题目思路代码题目Thanh想在一面被均分为 N 段的墙上画一幅精美的壁画。每段墙面都有一个美观评分,这表示它的美观程度(如果它的上面有画的话)。不幸的是,由于洪水泛滥,墙体开始崩溃,所以他需要加快他的作画进度!每天Thanh可以绘制一段墙体。在第一天,他可以自由的......
  • 二分+前缀和——洛谷P1314
    1.公式解读[...]  括号内内容为真则其值等于1,内容为假则其值等于0 2.思路这是一个关于单调性判定的问题,当W不断增大,差值由大变小再变大(实际是从负到0到正,只不过要取绝对值,不影响它的单调性),而目标则是在0的附近找到一个绝对值最小的值,因此是一道二分答案题,但如果......