这题吼啊...

然而还是想了$2h$,写了$1h$。

我们发现一个性质:若一个序列$p$能作为前缀和,那么在序列$p$中,包含序列$p$最后一个数的所有子序列必然都是非负的。

那么,我们

令$f[i]$表示状态$i$中所有数字全部作为前缀和的方案数。

令$g[i]$表示状态$i$中所有数字所组合成的任意排列中,前缀和永远为负数的方案数。

令$s[i]$表示状态$i$中所有数字之和。

ps:若i的第j个二进制位为$1$,则表示状态$i$中,选择了数字$a_j$。($a$序列的下表为$0$到$n-1$)

通过冷静分析,不难得出:

$s[i]$很好求

$f[i]=\sum_{(2^j\ and\ i)=2^j∩s[i-2^j]+a[j]≥0} f[i-2^j]$

$g[i]=\sum_{(2^j\ and\ i)=2^j∩s[i-2^j]+a[j]<0} g[i-2^j]$

显然$f[0]=g[0]=1$。

统计答案时,分前缀和$≥0$,前缀和$<0$两类讨论。

当前缀和$≥0$时

$ans1=\sum_{i=1}^{2^n-1} s[i] \times f[i] \times g[2^n-1-i] $

当前缀和<0时

$ans2=\sum_{j=0}^{n=1} \sum_{i=0} (a[j]+s[i])\times f[i]\times g[2^n-1-i-2^j]\ \ \ [(2^j\ and\ i=0)∩s[i]<0∩s[i]>-a[j]]$

最终所求答案即$ans1+ans2$。

然后就完结了。

时间复杂度为$O(n \times 2^n)$。

 #include<bits/stdc++.h>
#define M 20
#define L long long
#define MOD 998244353
using namespace std; L f[<<M]={},g[<<M]={},a[M]={},he[<<M]={}; int main(){
int n,m; scanf("%d",&n); m=<<n;
for(int i=;i<n;i++) cin>>a[i];
for(int i=;i<m;i++)
for(int j=;j<n;j++)
if(i&(<<j)) he[i]+=a[j];
f[]=;
for(int i=;i<m;i++){
for(int j=;j<n;j++)
if((i&(<<j))&&he[i^(<<j)]+a[j]>=){
f[i]=(f[i]+f[i^(<<j)])%MOD;
}
}
for(int i=;i<n;i++) a[i]=-a[i];
for(int i=;i<m;i++) he[i]=-he[i];
g[]=;
for(int i=;i<m;i++){
for(int j=;j<n;j++)
if((i&(<<j))&&he[i^(<<j)]+a[j]>){
g[i]=(g[i]+g[i^(<<j)])%MOD;
}
}
for(int i=;i<n;i++) a[i]=-a[i];
for(int i=;i<m;i++) he[i]=-he[i];
L ans=;
for(int j=;j<n;j++) if(a[j]<){
//f[1<<j]=1;
for(int i=;i<m;i++)
if((i&(<<j))==){
if(he[i]<||he[i]>-a[j]) continue;
int hh=(m-)^i^(<<j);
ans=(ans+(a[j]+he[i])*f[i]%MOD*g[hh]%MOD+MOD)%MOD;
}
}
for(int i=;i<m;i++)
ans=(ans+f[i]*he[i]%MOD*g[(m-)^i]%MOD+MOD)%MOD;
cout<<ans<<endl;
}

【PKUSC2018】【loj6433】最大前缀和 状压dp的更多相关文章

  1. LOJ#6433. 「PKUSC2018」最大前缀和 状压dp

    原文链接https://www.cnblogs.com/zhouzhendong/p/LOJ6433.html 题解 枚举一个集合 S ,表示最大前缀和中包含的元素集为 S ,然后求出有多少个排列是这 ...

  2. LOJ 6433 「PKUSC2018」最大前缀和——状压DP

    题目:https://loj.ac/problem/6433 想到一个方案中没有被选的后缀满足 “该后缀的任一前缀和 <=0 ”. 于是令 dp[ S ] 表示选了点集 S ,满足任一前缀和 & ...

  3. [PKUSC2018]最大前缀和——状压DP

    题目链接: [PKUSC2018]最大前缀和 设$f[S]$表示二进制状态为$S$的序列,任意前缀和都小于等于$0$的方案数. 设$g[S]$表示二进制状态为$S$的序列是整个序列的最大前缀和的方案数 ...

  4. BZOJ5369:[PKUSC2018]最大前缀和(状压DP)

    Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于是小C决定把序列随机打乱,然后取序列的最大前缀和作为答案. 小C ...

  5. BZOJ_5369_[Pkusc2018]最大前缀和_状压DP

    BZOJ_5369_[Pkusc2018]最大前缀和_状压DP Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于 ...

  6. 「PKUSC2018」最大前缀和(状压dp)

    前言 考试被\(hyj\)吊着打... Solution 考虑一下如果前缀和如果在某一个位置的后面的任意一个前缀和都<=0,肯定这就是最大的. 然后这样子就考虑左右两边的状压dp,然后就好了. ...

  7. Loj 6433. 「PKUSC2018」最大前缀和 (状压dp)

    题面 Loj 题解 感觉挺难的啊- 状压\(dp\) 首先,有一个性质 对于一个序列的最大前缀和\(\sum_{i=1}^{p} A[i]\) 显然对于每个\(\sum_{i=p+1}^{x}A[i] ...

  8. 【洛谷5369】[PKUSC2018] 最大前缀和(状压DP)

    点此看题面 大致题意: 对于一个序列,求全排列下最大前缀和之和. 状压\(DP\) 考虑如果单纯按照题目中对于最大前缀和的定义,则一个序列它的最大前缀和是不唯一的. 为了方便统计,我们姑且规定,如果一 ...

  9. T2988 删除数字【状压Dp+前缀和优化】

    Online Judge:从Topcoder搬过来,具体哪一题不清楚 Label:状压Dp+前缀和优化 题目描述 给定两个数A和N,形成一个长度为N+1的序列,(A,A+1,A+2,...,A+N-1 ...

随机推荐

  1. 客户端、服务器端中JSON字符串与对象的转换

    客户端: 字符串转为对象:$.parseJSON(json); 对象转为字符串:JSON.stringify(_pasteDataItem) 服务器端(c#): 对象: [DataContract(N ...

  2. METAGENOMIC SEQUENCING ANALYSIS WORKFLOW

    Metagenomics is defined as the study of the metagenome, which is total genomic DNA from environmenta ...

  3. 2018.10.18 NOIP训练 01矩阵(组合数学)

    传送门 组合数学好题. 题目要求输出的结果成功把概率转化成了种类数. 本来可以枚举统计最小值为iii时的概率. 现在只需要统计最小值为iii时的方案数,每一行有不少于iii个1的方案数. 显然一行选i ...

  4. 2018.09.27 bzoj2510: 弱题(概率dp+循环矩阵优化)

    传送门 简单概率dp. 显然每次转移的式子可以用一个矩阵表示出来: 这个是循环矩阵. 因此只用维护第一行快速幂一波就行了. 代码: #include<bits/stdc++.h> #def ...

  5. 2018.08.17 洛谷P3135 [USACO16JAN]堡哞(前缀和处理)

    传送门 有趣的前缀和. 数据范围中的n≤200" role="presentation" style="position: relative;"> ...

  6. EXT combobox 二级连动 清空store缓存数据

    项目中有这样的一个需求,做一个连动操作,如图: 所属行业中的combobox中下拉框中的值会根据前一个选择框中的值动态去变化,这个其实非常好做,但不是我现在讨论的主要问题,主要问题是,当第二次选择了& ...

  7. 在windows7下创建ftp服务站点

    1.开始->控制面板->程序(点击“卸载程序”)->启动或关闭windows功能->Internet Information Services(Internet信息服务)-&g ...

  8. centos6.5(64位)离线安装scalr

    1.下载scalr-server安装备包: 下载地址:http://pan.baidu.com/s/1eSA3dom scalr-server-5.1.0.oss-nightly.2015013004 ...

  9. Linux下安装配置 Jdk1.6+Tomcat6+Apache2.2.x+jk_mod1.2 详解

    本篇以Redhat AS5,内核为Linux 2.6.18-8.el5 为例,其中Redhat/Fedora系列基本一致,其他Linux或者版本均可以参考. STEP 1 软件下载:1. jdk1.6 ...

  10. hdu 5882 Balanced Game 2016-09-21 21:22 80人阅读 评论(0) 收藏

    Balanced Game Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...