Description

小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和。
但是小C并不会做这个题,于是小C决定把序列随机打乱,然后取序列的最大前缀和作为答案。
小C是一个非常有自知之明的人,他知道自己的算法完全不对,所以并不关心正确率,他只关心求出的解的期望值,
现在请你帮他解决这个问题,由于答案可能非常复杂,所以你只需要输出答案乘上n!后对998244353取模的值,显然这是个整数。
注:最大前缀和的定义:i∈[1,n],Sigma(aj)的最大值,其中1<=j<=i

Input

第一行一个正整数nnn,表示序列长度。
第二行n个数,表示原序列a[1..n],第i个数表示a[i]。
1≤n≤20,Sigma(|Ai|)<=10^9,其中1<=i<=N

Output

输出一个非负整数,表示答案。

Sample Input

2
-1 2

Sample Output

3

Solution

首先对于一个序列$[a_1,a_n]$,设最大前缀和的位置为$p$,那么序列$[a_{p+1},a_n]$的任意一个前缀必须都$<=0$。否则的话你用最大前缀和随便加上$[a_{p+1},a_n]$中$>0$的一个前缀就可以得到新的最大前缀和。

预处理:

$sum[S]$表示集合$S$的数字和。

$f[S]$表示钦定集合$S$当最大前缀的合法方案数。

$g[S]$表示集合$S$任意前缀和$<=0$小于$0$的方案数。

那么显然$ans=\sum sum[S]\times f[S]\times g[S']$。其中$S'$是$S$的补集。

$sum$和$g$都是可以直接求的,那么$f$呢?

可以发现,如果$sum[S]>0$,那么把随便一个数放到这个集合$S$的最前面,这个最大前缀和仍然是可以保证合法的。

$ans$最后忘了取模$WA$了好几发……心态崩了

Code

 #include<iostream>
#include<cstdio>
#define N (21)
#define MOD (998244353)
using namespace std; int n,m,a[N],sum[<<N],cnt[<<N],f[<<N],g[<<N]; int main()
{
scanf("%d",&n); m=(<<n)-;
for (int i=; i<=n; ++i) scanf("%d",&a[i]);
for (int i=; i<=n; ++i)
for (int S=; S<=m; ++S)
if (S&(<<i-)) sum[S]+=a[i], cnt[S]++; for (int S=; S<=m; ++S)
{
if (cnt[S]==) {f[S]=; continue;}
for (int i=; i<=n; ++i)
if ((S&(<<i-)) && sum[S]-a[i]>)
(f[S]+=f[S^(<<i-)])%=MOD;
} g[]=;
for (int S=; S<=m; ++S)
{
if (sum[S]>) {g[S]=; continue;}
if (cnt[S]==) {g[S]=; continue;}
for (int i=; i<=n; ++i)
if (S&(<<i-))
(g[S]+=g[S^(<<i-)])%=MOD;
}
int ans=;
for (int S=; S<=m; ++S)
(ans+=1ll*sum[S]*f[S]%MOD*g[m^S]%MOD)%=MOD;
ans=(ans%MOD+MOD)%MOD;
printf("%d\n",ans);
}

BZOJ5369:[PKUSC2018]最大前缀和(状压DP)的更多相关文章

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

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

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

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

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

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

  4. 【PKUSC2018】【loj6433】最大前缀和 状压dp

    这题吼啊... 然而还是想了$2h$,写了$1h$. 我们发现一个性质:若一个序列$p$能作为前缀和,那么在序列$p$中,包含序列$p$最后一个数的所有子序列必然都是非负的. 那么,我们 令$f[i] ...

  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. 基于spring boot的定时器

    首先,搭建好一个springboot项目 方法一:通过springboot自带入口来开启定时器. 首先我们都知道,springboot有一个自己的入口,也就是@SpringBootApplicatio ...

  2. C#+三层+会员管理系统源码

    本打算上51aspx的   但是他们说我做的太简单..,那我还是拿出来共享给大家 源码下载地址 链接:http://pan.baidu.com/s/1boAwv2R 密码:ycrf 源码描述:一.源码 ...

  3. C# 四舍五入 保留两位小数(转载)

    一.C#默认四舍五入 1 Math.Round(45.367,2) //Returns 45.372 Math.Round(45.365,2) //Returns 45.36二.C#中的Round() ...

  4. 当堆遇到STL 代码焕发光芒

    来自度娘的释义,堆的含义大概是这样的: 感性理解: 堆(英语:heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质: 堆中某个节点的值总是不大于 ...

  5. 调用百度api输出地址和城市查询出具体坐标系

    在工作中遇到标题的内容,不知道如何写,后来我的领导写了一套代码,感觉很是厉害,特在此收藏,留作纪念 public static string GetResponse(string address, s ...

  6. [css3] 看博客学习别人的旋转的星球

    定义一个div 太阳轨道sunline,边框显示出来,定义position为relative #sunline{ width: 500px; height: 500px; border:2px sol ...

  7. [Redis] redis在centos下安装测试

    下载软件,使用命令wget xxx,参数:url 例如: wget http://download.redis.io/releases/redis-3.0.0.tar.gz 解压缩,使用命令tar,参 ...

  8. Git 入门详解

    Git git核心概念详解 什么是git git是一个分布式版本控制软件,最初由林纳斯·托瓦兹创作,于2005年以GPL发布.最初目的是为更好地管理Linux内核开发而设计.应注意的是,这与GNU I ...

  9. Hbuilder配置识别逍遥安卓模拟器

    最近在公司,需要开发一款智能家居APP,用到MUI框架,首先就是环境搭建,写好的APP页面,怎么跑在模拟器上运行? 我的开发环境: HBuilder版本:9.0.2.201803061935 逍遥安卓 ...

  10. POJ2236(KB5-A)

    Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 28617   Accepted: 118 ...