首页 > 其他分享 >高维前缀和(SOS DP)

高维前缀和(SOS DP)

时间:2024-03-13 22:15:40浏览次数:27  
标签:10 le 前缀 int SOS DP 高维 题意

引入方法

在讨论高维前缀和前,不妨先回顾以下二维前缀和,一种写法是:

for(int i = 1; i <= w; i++)
	for(int j = 1; j <= w; j++)
        sum[i][j] += sum[i][j - 1]
for(int i = 1; i <= w; i++)
	for(int j = 1; j <= w; j++)
        sum[i][j] += sum[i - 1][j]       

推广到 \(n\) 维就是:

for(int x1 = 1; x1 <= w; x1++)
    for(int x2 = 1; x2 <= w; x2++)
        ...
        for(int xn = 1; xn <= w; xn++)
            sum[x1][x2]...[xn] += sum[x1 - 1][x2]...[xn]
for(int x1 = 1; x1 <= w; x1++)
    for(int x2 = 1; x2 <= w; x2++)
        ...
        for(int xn = 1; xn <= w; xn++)
            sum[x1][x2]...[xn] += sum[x1][x2 - 1]...[xn]
...
for(int x1 = 1; x1 <= w; x1++)
    for(int x2 = 1; x2 <= w; x2++)
        ...
        for(int xn = 1; xn <= w; xn++)
            sum[x1][x2]...[xn] += sum[x1][x2]...[xn - 1]

解决问题

它有什么用吗?看这个问题:

计算所有的 \(f(S)=\sum_{T \in S} g(T)\)。

暴力枚举子集时间复杂度为 \(O(3^n)\)。其中 \(n = |S|\)。

但使用高维前缀和可以优化到 \(O(n2^n)\)。

不难发现,对于每个元素,只有选与不选两种可能,可以记作 \(0/1\)。不妨看作有 \(n\) 维,每维的空间大小都是 \(2\)。对于一个 \(1\),可以允许 \(0/1\);对于一个 \(0\),可以允许 \(0\)。

实际上就是在求一个高维前缀和,我们可以状态压缩成一个二进制数,然后模拟上述过程即可。

代码实现如下:

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

例题讲解

一、P5495 【模板】Dirichlet 前缀和:
题意:

给定一个长度为 \(n\) 的数列 \(a_1,a_2,a_3,\dots,a_n\)。

现在你要求出一个长度为 \(n\) 的数列 \(b_1,b_2,b_3,\dots,b_n\),满足:

\[b_k=\sum_{i|k}a_i \]

\(n \le 2 \times 10^7\)。

分析:

考察对高维前缀和的理解。

对于一个 \(a\),它对 \(b\) 有贡献当且仅当 \(p_{i} \le q_{i}\),其中 \(a=\prod_{P \in prim} P^{p_{i}},b=\prod_{P \in prim} P^{q_{i}}\)。

把每个质数看成一维,那么就是在求一个高维前缀和。可以直接用这个数的值表示它的状态。

枚举每个质数,加上除去这个质数的答案。

具体来说就是这样算:

for(int i = 2; i <= n; i++) {
	if(f[i]) continue; //f[i]表示是否是合数
	for(int j = 1; i * j <= n; j++)
		a[i * j] += a[j]; 
}
二、[ARC100E] Or Plus Max
题意:

给你一个长度为 \(2^n\) 的序列 \(a\),每个\(1\le K\le 2^n-1\),找出最大的 \(a_i+a_j\)(\(i \mathbin{\mathrm{or}} j \le K\),\(0 \le i < j < 2^n\))并输出。

\(n \le 18,a_{i} \le 10^9\)。

分析:

对于每个 \(K\),我们可以去求 \(i \in K\) 的最大值与次大值,作为 \(i\) 与 \(j\),然后对 \(K-1\) 的答案取 \(\max\) 即可。

容易发现这样做不存在一对 \(i,j\) 本来不能被统计而被统计了,也不存在本来应该被统计而没被统计。

高维前缀 \(\max\) 即可。

三、[CF1208F] Bits And Pieces
题意:

给定 \(n\) 个数的数组 \(a\),找到 $i\lt j\lt k $ 的 \(i,j,k\),使得 \(a_i|(a_j \& a_k)\) 最大。

\(n \le 10^6,a_{i} \le 2 \times 10^6\)。

分析:

考虑枚举 \(i\),然后从高往低位贪心。

  • \(a_{i}\) 的第 \(j\) 位为 \(1\),没有任何限制条件,当前答案直接加上 1<<j 即可。
  • \(a_{i}\) 的第 \(j\) 位为 \(0\)。增加限制条件,利用高维前缀和维护一个满足这个限制条件的数的位置的最大值与次大值,如果能找到更新答案,否则恢复成原来的限制条件。

时间复杂度 \(O(n \log w+w \log w)\)。

标签:10,le,前缀,int,SOS,DP,高维,题意
From: https://www.cnblogs.com/xcs123/p/18071651

相关文章

  • 插头 dp 小记
    这里默认各位都会轮廓线dp。引入Luogu5074EattheTrees题意:给出\(n\timesm\)的方格,有些格子不能铺线,其它格子必须铺,可以形成多个闭合回路。问有多少种铺法?\(2\len,m\le12\)考虑如果每个格子和相邻格子(包括边缘)的衔接都合法,最终一定能形成若干个闭合回路,因此我们只......
  • TCP和UDP
    计算机网络的七层协议计算机网络体系可以大致分为一下三种,OSI七层模型、TCP/IP四层模型和五层模型。七层协议的功能:物理层:负责处理网络通信的物理传输和传输介质的细节。物理层的主要任务是将比特流(bitstream)从发送方传输到接收方,确保数据能够在网络中进行可靠的物理传输。......
  • 序列 DP
    (1)LOJP507接竹竿有\(n\)张牌排成一排,每张牌有属性\((c_i,v_i)\)。保证\(c_i\lek\)。每次操作选择两张牌\(l,r\)满足\(c_l=c_r\),删除\(l\simr\)中的所有牌,并获得\(\sum_{i=l}^rv_i\)的收益。求最大的收益。\(n,k\le10^6\)。设状态\(f_i\)表......
  • Offer必备算法13_路径dp_六道力扣题详解(由易到难)
    目录①力扣62.不同路径解析代码②力扣63.不同路径II解析代码③力扣LCR166.珠宝的最高价值解析代码④力扣931.下降路径最小和解析代码⑤力扣64.最小路径和解析代码⑥力扣174.地下城游戏解析代码本篇完。①力扣62.不同路径62.不同路径难度中等一个......
  • 从CF1941D与1741E初探可达性DP
    Problem-D-Codeforces用记忆化搜索过的,然而DP能快300ms记忆化搜索|\(\texttt{set}\)模拟核心思路一致,都是通过定义一个状态,即在第t次到达第now点来去重剪枝记忆化搜索intn,m,x;std::vector<std::pair<int,char>>step;std::set<int>S;intgetClock(intx,......
  • 【Paper Reading】7.DiT(VAE+ViT+DDPM) Sora的base论文
    VAEDDPM 分类内容论文题目ScalableDiffusionModelswithTransformers作者WilliamPeebles(UCBerkeley),SainingXie(NewYorkUniversity)发表年份2023摘要介绍了一类新的扩散模型,这些模型利用Transformer架构,专注于图像生成的潜在扩散模型。这些......
  • GDPU JavaWeb JSP基础
    正式走进Javaweb大门,了解jsp及Java在前端的体现。JSP JSP,JavaServerPages是一种基于Java技术的服务器端动态网页技术,允许开发人员在HTML页面中嵌入Java代码。通过JSP,开发人员可以创建包含静态模板和动态内容的网页。当客户端请求一个包含JSP的网页时,服务器会执行其中的J......
  • GDPU unity游戏开发 滚动小球
      解锁你的游戏大门,适合小白入门看的,通过简单的实例大概了解unity的一些基本操作。常用快捷键 CtrlC/V/X/Z对应复制/粘贴/剪切/回退很多小白都惟手熟尔了,W物体对象的位置/平移/移动 ,E物体对象旋转,R物体对象缩放,Q/Alt中键用于场景的移动,右键/Alt左键用于场景的旋转,滚......
  • 高dpi下,Vb.net调整控件位置的小经验
     高dpi下,Vb.net调整控件位置的小经验 boy8199/3vdo/club最近写了一个捕快TXT网文采集软件,结果发现在DPI不同的情况下,软件布局会变形.找了半天原因才发现是DPI的问题,默认系统的dpi是96(100%)现在显示器的屏幕比较大,所以好多人会把显示放大到125%或150%导致程序控件变形......
  • 【蓝桥杯】(台阶方案dp)
    #include<iostream>usingnamespacestd;#defineLLlonglongconstintN=1e6+5;constLLp=1e9+7;LLdp[N];inta[3];//intmain(){LLn;cin>>n;cin>>a[0]>>a[1]>>a[2];dp[0]=1;//当目标值为0时,只有一种方案for(......