bzoj 5369 最大前缀和
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 最大前缀和相关推荐
- bzoj 5369: [Pkusc2018]最大前缀和
Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于是小C决定把序列随机打乱,然后取序列的最大前缀和作为答案. 小C ...
- 一句话题解(20170801~20170125)
8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...
- BZOJ.3495.[PA2010]Riddle(2-SAT 前缀优化建图)
题目链接 每个城市要么建首都要么不建,考虑2-SAT 这样一个国家内城市两两连边是很显然的,但是边数为O(n^2) 每个国家中仅有一个建首都,考虑新建前缀S[i]=1/0这2n个点表示当前国家的[1, ...
- bzoj 3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛——前缀和优化dp / 排列组合
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3398 好简单呀.而且是自己想出来的. dp[ i ]表示最后一个牡牛在 i 的方案数. 当前 ...
- [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\ . ...
- BZOJ 1218(二维前缀和)
传送门: 题面: 1218: [HNOI2003]激光炸弹 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4197 Solved: 1788 [S ...
- BZOJ 1303: [CQOI2009]中位数图【前缀和】
1303: [CQOI2009]中位数图 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2737 Solved: 1698 [Submit][Sta ...
- bzoj 1503 郁闷的出纳员 (平衡树+前缀和)
题意 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资. ...
- 【bzoj 4976】宝石镶嵌(贪心、高位前缀和)
传送门biu~ 当n-k>=16时,每一位上的1都可以出现,只需要考虑每位是否有1即可. 剩下的情况n最大只有115(数据范围瞬间变得友善了). 令f[state]代表组合出state最少需要多 ...
- BZOJ 1590.Secret Message 秘密信息(Trie树) [Usaco2008 Dec]【BZOJ计划】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ简单题合集x Weblink https://hydro.ac/d/bzoj/p/1590 P ...
最新文章
- IHttpHandler 在SharePoint中的应用
- ffmpeg的编译大全
- a - 数据结构实验之串一:kmp简单应用_【在线教学示范课案例】数据结构(刘航)...
- linux 网络设备 安装,Linux_Linux系统配置网络详解,一.安装和配置网络设备- phpStudy...
- c3p0连接池的配置和简单使用
- G++编译Note Pad++
- Java 正则提取银行短信内容
- 故宫门票预订网站崩溃;岳云鹏信息打包卖 100 元;华为要做电视?| 极客头条...
- QT练习5:显示GIF图片
- Visual Studio Code编辑器的实用插件和工作中实用的技巧
- 计算机上u盘打不开,u盘打不开怎么办,插在电脑上有显示,但是打不开?
- 国内十大白银期货APP最新排名
- r语言算巢式设计方差分析_R语言学习笔记(七):方差分析
- 小米HTML查看器记住密码,小米路由器3管理密码_默认密码是多少?-192路由网
- 学生成绩管理系统 easyx库(半成品
- 我从非科班转到图像算法工程师(图像识别、机器学习、深度学习)(3个月)的经历
- Python第三方库turtle画小人发射爱心
- 为什么SAST和SCA在SDLC中很重要?
- 解决 Hyper-V R2 虚拟网卡影响网速变慢问题
- 傅里叶变换、短时傅里叶变换、小波变换
热门文章
- NLP专题:LSA浅层语义分析
- 山西台达plc可编程控制器_可编程控制器10(PLC)基本指令系统
- 浩若烟海事半功倍|利用Docker容器技术构建自动化分布式web测试集群Selenium Grid
- [转]	 世界上超难找的药方,为爸妈留着,怕以后找不到了就转来了
- 计算机画图图形组合教案,绘制简单的图形教案
- 怎么把pdf分开?pdf文件拆分为单个pdf怎么拆分?
- 计算机电源原如何确定正常,如何判断笔记本电脑电源是否工作 要点在这里
- RobotStudio软件:ABB机器人喷涂虚拟仿真
- 案例|工业物联网解决方案•工业互联网云平台
- psd导出jpg太大_PSD源文件、导出JPG\PNG格式文件过大解决办法