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

高维前缀和

时间:2024-05-28 22:33:12浏览次数:15  
标签:dots le 前缀 int sum subseteq 高维

  • 给定 \(n, q\) 和 \(f(0), f(1), \dots, f(2^n - 1)\)。\(q\) 次询问,给定 \(S\),求:

    \[\sum_{S' \subseteq S} f(S') \]

  • \(n \le 20\),\(q \le 10^6\)。

令 \(S_i\) 表示 \(S\) 的第 \(i\) 个二进制位。

可以发现若 \(S' \subseteq S\),那么对于所有 \(i\) 都有 \(S'_i \le S_i\)。也就是要求:

\[\sum_{S'_0 = 0}^{S_0}\sum_{S'_1 = 0}^{S_1} \sum_{S'_2 = 0}^{S_2}\dots, \sum_{S'_{n-1} = 0}^{S_{n-1}} f(S') \]

发现这就是一个 \(n\) 维的前缀和的形式。

对于二维前缀和,除朴素的容斥做法 \(s_{i, j} = s_{i, j - 1} + s_{i - 1, j} - s_{i - 1, j - 1} + a_{i, j}\) 外,可以用这种方式:

for (int i = 1; i <= n; ++ i )
	for (int j = 1; j <= n; ++ j )
		a[i][j] += a[i][j - 1];
for (int i = 1; i <= n; ++ i )
	for (int j = 1; j <= n; ++ j )
		a[i][j] += a[i - 1][j];

第一个循环后,\(a_{i, j} = a_{i, 1} + a_{i, 2} + \dots + a_{i, j}\),表示先对每行单独做一遍前缀和。

第二个循环后,\(a_{i, j}\) 就是真正的左上矩阵的和,此时是对每列单独做一遍前缀和。

同理可以延伸到三维:

for (int i = 1; i <= n; ++ i )
	for (int j = 1; j <= n; ++ j )
		for (int k = 1; k <= n; ++ k )
			a[i][j][k] += a[i - 1][j][k];
for (int i = 1; i <= n; ++ i )
	for (int j = 1; j <= n; ++ j )
		for (int k = 1; k <= n; ++ k )
			a[i][j][k] += a[i][j - 1][k];
for (int i = 1; i <= n; ++ i )
	for (int j = 1; j <= n; ++ j )
		for (int k = 1; k <= n; ++ k )
			a[i][j][k] += a[i][j][k - 1];

枚举范围为 \([0, 1]\) 时就可以用位运算计算了。

我们令答案式为 \(g(S)\)。类比上边两份代码,可以得到:

for (int j = 0; j < n; ++ j )
    for (int i = 0; i < (1 << n); ++ i )
		if (i >> j & 1)
			g[i] += g[i ^ (1 << j)];

标签:dots,le,前缀,int,sum,subseteq,高维
From: https://www.cnblogs.com/2huk/p/18219092

相关文章

  • 如何在AutoCAD中添加图层前缀
    在AutoCAD绘图过程中,合理地管理图层是确保绘图效率和清晰度的关键。有时,我们可能需要为图层添加统一的前缀,以便于区分不同的图层组或满足特定的绘图标准。本文将介绍如何使用AutoCAD.NETAPI创建一个简单的工具,以自动添加图层前缀。环境准备在开始之前,请确保您具备以下条件:......
  • linux shell中移除文件的后缀、前缀
     001、[root@PC1test2]#a="a.csv.map.txt"[root@PC1test2]#echo$aa.csv.map.txt[root@PC1test2]#echo${a%.*}a.csv.map[root@PC1test2]#echo${a%%.*}a 。 002、[root@PC1test2]#ls[root@PC1test2]#a="a.csv.map.txt"[root@......
  • 算法刷题笔记 前缀和(C++实现)
    文章目录题目描述基本思路实现代码题目描述输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l,r。对于每个询问,输出原序列中从第l个数到第r个数的和。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数数列。接下来m行,每行包含两个整数......
  • pde复习 第一章波动方程 第四节 高维波动方程的Cauchy问题
    2024-05-1816:14:50星期六知识点梳理本节讨论的是高维波动方程,主要是计算\(\star\)公式为\(\star\)公式一定要记清,下面给出一些例题,动手计算。例题阅读顺序从左到右再下一行。评注:上面的两个例题的所有解法都值得认真看,还有里面的技巧(三角函数的周期性和正交性),特......
  • 前缀和 / 差分
    前置知识有某些运算拥有逆运算,通过逆运算,可以撤销原运算的效果。比如:加法和减法互为逆运算、乘法和除法互为逆运算、异或的逆运算就是自身、求最大值、最小值不具有逆运算、修改不具有逆运算。前缀和区间的操作必须拥有逆运算才可用前缀和,所以任意区间的运算结果都可以由两个......
  • LaTeX 常用引用标签前缀
    引用对象标签前缀ChapterchSectionsecSubsectionsecAppendixappFigurefigTabletabListitemitmEquationeqnAlgorithmalg参考:LaTeX交叉引用系统简介......
  • 蓝桥杯-递增三元组(三种解法,二分, 双指针, 前缀和)
    给定三个整数数组A=[A1,A2,…AN],B=[B1,B2,…BN],C=[C1,C2,…CN],请你统计有多少个三元组(i,j,k)满足:1≤i,j,k≤NAi<Bj<Ck输入格式第一行包含一个整数N。第二行包含N个整数A1,A2,…AN。第三行包含N个整数B1,B2,…BN。第四行包含N个整数C1,C2,…CN。输出格......
  • ABC353E字典树处理最长公共前缀
    https://atcoder.jp/contests/abc353/tasks/abc353_e其实就是字典树板子题。似乎遇到最长公共前缀,就该想到字典树。依次加入每个字符串:维护一个数组siz来统计在当前串之前的串在对应点的出现次数。手模一下字典树的建树过程,显然如果当前串\(S_i\)能跑到一个曾经串\(S_......
  • 前缀和
    前缀和一维前缀和S[i]=a[1]+a[2]+...a[i]a[l]+...+a[r]=S[r]-S[l-1]//注意,S从1开始比较好二维前缀和S[i,j]=第i行j列格子左上部分所有元素的和以(x1,y1)为左上角,(x2,y2)为右下角的子矩阵的和为:S[x2,y2]-S[x1-1,y2]-S[x2,y1-1]+S[x1......
  • 208. 实现 Trie (前缀树)-python
    Trie(发音类似"try")或者说前缀树是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现Trie类:Trie()初始化前缀树对象。voidinsert(Stringword)向前缀树中插入字符串word。booleansearch(St......