Written with StackEdit.

Description

小\(C\)是一个算法竞赛爱好者,有一天小\(C\)遇到了一个非常难的问题:求一个序列的最大子段和。

但是小\(C\)并不会做这个题,于是小\(C\)决定把序列随机打乱,然后取序列的最大前缀和作为答案。

小\(C\)是一个非常有自知之明的人,他知道自己的算法完全不对,所以并不关心正确率,他只关心求出的解的期望值,

现在请你帮他解决这个问题,由于答案可能非常复杂,所以你只需要输出答案乘上\(n!\)后对\(998244353\)取模的值,显然这是个整数。

Input

第一行一个正整数\(n\),表示序列长度。

第二行\(n\)个数,表示原序列\(a[1..n]\),第\(i\)个数表示\(a[i]\)。

\(1≤n≤20,Sigma(|A_i|)<=10^9\),其中\(1<=i<=N.\)

Output

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

Sample Input

2
-1 2

Sample Output

3

Solution

  • 注意到\(n\)很小,每个子集的权值和我们可以暴力计算得出.
  • 直接考虑各个子集作为最大前缀和.
  • 显然,一个子集\(S\)排列后能成为最大前缀和,那么这个排列中不能有负的后缀和(否则去掉会更优),剩下的数排列后不能有正的前缀和(否则加上会更优).
  • 我们令\(f[S]\)表示将\(S\)集合中的数排成没有负的后缀和的排列的方案数,\(g[S]\)表示将\(S\)集合中的数排成没有正的前缀和的排列的方案.
  • 那么易知答案即为\(\sum_{S\in U,sum[S]>=0}f[S]*g[\complement_{U}S]*sum[S]\).
  • 考虑如何快速计算出\(f\)和\(g\).若对于一个集合\(i\),新增了一个数\(j\).(\(j\notin i\)).
  • 我们可以将\(i\)任意排列,再将\(j\)放在最后,方案数为\(f[i]\)或\(g[i]\),统计入贡献.每个集合中的每个数都会被放在最后转移过来,所以总贡献一定是正确的.
  • 这样,只需要在加数的时候判断一下\(sum[i]\)的符号,即可确定转移\(f\)或\(g\).
#include<bits/stdc++.h>
using namespace std;
typedef long long LoveLive;
inline int read()
{int out=0,fh=1;char jp=getchar();while ((jp>'9'||jp<'0')&&jp!='-')jp=getchar();if (jp=='-'){fh=-1;jp=getchar();}while (jp>='0'&&jp<='9'){out=out*10+jp-'0';jp=getchar();}return out*fh;
}
const int P=998244353;
const int MAXS=(1<<20)+10;
inline int add(int a,int b)
{return (a + b) % P;
}
inline int mul(int a,int b)
{return 1LL * a * b % P;
}
int a[21];
int sum[MAXS],f[MAXS],g[MAXS];
int n;
inline int calc(int S)
{int res=0;for(int i=0;i<n && S;++i,S>>=1)if(S&1)res+=a[i];return res;
}
int main()
{n=read();for(int i=0;i<n;++i)a[i]=read();int S=1<<n;for(int i=0;i<S;++i)sum[i]=calc(i);for(int i=0;i<n;++i)f[1<<i]=1,g[1<<i]=1;for(int i=0;i<S;++i){if(sum[i]>0){for(int j=0;j<n;++j)if(!((i>>j)&1))f[i^(1<<j)]=add(f[i^(1<<j)],f[i]);}else{for(int j=0;j<n;++j)if(!((i>>j)&1))g[i^(1<<j)]=add(g[i^(1<<j)],g[i]);}}int ans=0;int U=S-1;g[0]=1;for(int i=0;i<S;++i)if(sum[U^i]<=0)ans=add(ans,mul(mul(f[i],sum[i]),g[U^i]));printf("%d\n",add(ans,P));return 0;
}

转载于:https://www.cnblogs.com/jklover/p/10024388.html

bzoj 5369 最大前缀和相关推荐

  1. bzoj 5369: [Pkusc2018]最大前缀和

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

  2. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

  3. BZOJ.3495.[PA2010]Riddle(2-SAT 前缀优化建图)

    题目链接 每个城市要么建首都要么不建,考虑2-SAT 这样一个国家内城市两两连边是很显然的,但是边数为O(n^2) 每个国家中仅有一个建首都,考虑新建前缀S[i]=1/0这2n个点表示当前国家的[1, ...

  4. bzoj 3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛——前缀和优化dp / 排列组合

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3398 好简单呀.而且是自己想出来的. dp[ i ]表示最后一个牡牛在 i 的方案数. 当前 ...

  5. [JZOJ5952] 凯旋而归 ([BZOJ 5092]【Lydsy1711月赛】分割序列)【高维前缀和】【DP】

    Description 对于一个长度为m的序列a,记f(a)=max⁡((a1xor...xorai)+(ai+1xor...xoran)),i∈[0,m]f(a)=\max((a_1\ xor\ . ...

  6. BZOJ 1218(二维前缀和)

    传送门: 题面: 1218: [HNOI2003]激光炸弹 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4197  Solved: 1788 [S ...

  7. BZOJ 1303: [CQOI2009]中位数图【前缀和】

    1303: [CQOI2009]中位数图 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2737  Solved: 1698 [Submit][Sta ...

  8. bzoj 1503 郁闷的出纳员 (平衡树+前缀和)

    题意 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资. ...

  9. 【bzoj 4976】宝石镶嵌(贪心、高位前缀和)

    传送门biu~ 当n-k>=16时,每一位上的1都可以出现,只需要考虑每位是否有1即可. 剩下的情况n最大只有115(数据范围瞬间变得友善了). 令f[state]代表组合出state最少需要多 ...

  10. BZOJ 1590.Secret Message 秘密信息(Trie树) [Usaco2008 Dec]【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ简单题合集x Weblink https://hydro.ac/d/bzoj/p/1590 P ...

最新文章

  1. IHttpHandler 在SharePoint中的应用
  2. ffmpeg的编译大全
  3. a - 数据结构实验之串一:kmp简单应用_【在线教学示范课案例】数据结构(刘航)...
  4. linux 网络设备 安装,Linux_Linux系统配置网络详解,一.安装和配置网络设备- phpStudy...
  5. c3p0连接池的配置和简单使用
  6. G++编译Note Pad++
  7. Java 正则提取银行短信内容
  8. 故宫门票预订网站崩溃;岳云鹏信息打包卖 100 元;华为要做电视?| 极客头条...
  9. QT练习5:显示GIF图片
  10. Visual Studio Code编辑器的实用插件和工作中实用的技巧
  11. 计算机上u盘打不开,u盘打不开怎么办,插在电脑上有显示,但是打不开?
  12. 国内十大白银期货APP最新排名
  13. r语言算巢式设计方差分析_R语言学习笔记(七):方差分析
  14. 小米HTML查看器记住密码,小米路由器3管理密码_默认密码是多少?-192路由网
  15. 学生成绩管理系统 easyx库(半成品
  16. 我从非科班转到图像算法工程师(图像识别、机器学习、深度学习)(3个月)的经历
  17. Python第三方库turtle画小人发射爱心
  18. 为什么SAST和SCA在SDLC中很重要?
  19. 解决 Hyper-V R2 虚拟网卡影响网速变慢问题
  20. 傅里叶变换、短时傅里叶变换、小波变换

热门文章

  1. NLP专题:LSA浅层语义分析
  2. 山西台达plc可编程控制器_可编程控制器10(PLC)基本指令系统
  3. 浩若烟海事半功倍|利用Docker容器技术构建自动化分布式web测试集群Selenium Grid
  4. [转] 世界上超难找的药方,为爸妈留着,怕以后找不到了就转来了
  5. 计算机画图图形组合教案,绘制简单的图形教案
  6. 怎么把pdf分开?pdf文件拆分为单个pdf怎么拆分?
  7. 计算机电源原如何确定正常,如何判断笔记本电脑电源是否工作 要点在这里
  8. RobotStudio软件:ABB机器人喷涂虚拟仿真
  9. 案例|工业物联网解决方案•工业互联网云平台
  10. psd导出jpg太大_PSD源文件、导出JPG\PNG格式文件过大解决办法