【LOJ6433】【PKUSC2018】最大前缀和

题面

题目描述

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

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

小 C 是一个非常有自知之明的人,他知道自己的算法完全不对,所以并不关心正确率,他只关心求出的解的期望值,现在请你帮他解决这个问题,由于答案可能非常复杂,所以你只需要输出答案乘上 \(n!\) 后对 \(998244353\) 取模的值,显然这是个整数。

注:最大前缀和的定义:\(\forall i \in [1,n]\),\(\sum_{j=1}^{i}a_j\) 的最大值。

输入格式

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

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

输出格式

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

样例

输入样例

2
-1 2

输出样例

3

提示与说明

对于\(10\%\)的数据,有\(1\leq n\leq 9\)

对于\(40\%\)的数据,有\(1\leq n\leq 15\)

另有\(10\%\)的数据,满足\(a\)中最多只有一个负数。

另有\(10\%\)的数据,满足\(|a[i]|\leq 2\)

对于\(100\%\)的数据,满足\(1\leq n\leq 20\),\(\sum_{i=1}^{n}|a[i]|\leq 10^9\)

题解

因为假如有\(\forall i\sum_{j=1}^{p-1} a_i\),且\(\exists \sum_{j=p}^na_j \geq 0\)

最优解肯定不在\(1-p-1\)中,所以

预处理几个东西(i是子集):

\(sum[i]:\)状态为\(i\)时所有数的和

\(f[i]:\)状态为\(i\)时和为\(sum[i]\)的方案数

\(g[i]:\)状态为\(i\)时排列为正的方案数

转移看代码

压行真舒服

代码

#include <iostream>
#include <cstdio>
using namespace std;
#define rep(i, from, to) for(int i = (from); i <= (to); i++)
typedef long long ll;
const int Mod = 998244353;
int N, a[20], f[1 << 20], g[1 << 20];
ll sum[1 << 20];
void pls(int &x, int y) { x += y; if (x >= Mod) x -= Mod; }
int main () {
cin >> N; rep(i, 0, N - 1) cin >> a[i];
int S = (1 << N) - 1;
g[0] = 1;
rep (i, 0, N - 1) { f[1 << i] = 1; rep(s, 0, S) if (s & (1 << i)) sum[s] += a[i]; }
rep (s, 0, S) {
if (sum[s] > 0) rep (i, 0, N - 1) { if ((s & (1 << i)) == 0) pls(f[s | (1 << i)], f[s]); }
else rep (i, 0, N - 1) if (s & (1 << i)) pls(g[s], g[s ^ (1 << i)]);
}
rep (s, 0, S) { sum[s] %= Mod; while (sum[s] < 0) sum[s] += Mod; }
int ans = 0; rep (s, 0, S) pls(ans, 1ll * sum[s] * f[s] % Mod * g[S ^ s] % Mod);
printf("%d\n", ans);
return 0;
}

【LOJ6433】【PKUSC2018】最大前缀和的更多相关文章

  1. LOJ6433 [PKUSC2018] 最大前缀和 【状压DP】

    题目分析: 容易想到若集合$S$为前缀时,$S$外的所有元素的排列的前缀是小于$0$的,DP可以做到,令排列前缀个数小于0的是g[S]. 令f[S]表示$S$是前缀,转移可以通过在前面插入元素完成. ...

  2. [LOJ6433] [PKUSC2018] 最大前缀和

    题目链接 LOJ:https://loj.ac/problem/6433 Solution 注意到最大前缀要满足什么性质,假设序列\(a[1..n]\)的最大前缀是\(s_x\),那么显然要满足所有\ ...

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

    分析 我们让每个数列在第一个取到最大前缀和的位置被统计到. 假设一个数列在\(pos\)处第一次取到最大前缀和,分析性质,有: 下标在\([1,pos]\)之间的数形成的数列的每个后缀和(不包括整个数 ...

  4. [PKUSC2018]最大前缀和

    [PKUSC2018]最大前缀和 题目大意: 有\(n(n\le20)\)个数\(A_i(|A_i|\le10^9)\).求这\(n\)个数在随机打乱后最大前缀和的期望值与\(n!\)的积在模\(99 ...

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

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

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

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

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

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

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

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

  9. BZOJ5369 [Pkusc2018]最大前缀和

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

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

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

随机推荐

  1. 问题:从键盘读取特定类型的数据(使用Scanner读取int类型)

    import java.util.Scanner; public class ScannerIntTest{ public static void main(String [] args){ int ...

  2. 【模板】Dijkstra总结

    Dijkstra算法使用于跑最短路的算法. 算法思想 假定图是不带负权的有向图或无向图,采用贪心策略,每次扩展一个距离为最短的点,在以这个点为中间点,更新其他的所有点的距离.当所有边权都为正时,由于不 ...

  3. Django中的CBV和FBV

    Django中的CBV和FBV 一.  CBV CBV是采用面向对象的方法写视图文件. CBV的执行流程: 浏览器向服务器端发送请求,服务器端的urls.py根据请求匹配url,找到要执行的视图类,执 ...

  4. Odoo模块添加logo

    模块的static目录是专门用于存放静态文件内容如:图片.css等的.其中,description目录是存放关于模块的一些描述性的文件的,其中,模块的图标也放在下面,以icon命名.

  5. Kali-linux Arpspoof工具

    Arpspoof是一个非常好的ARP欺骗的源代码程序.它的运行不会影响整个网络的通信,该工具通过替换传输中的数据从而达到对目标的欺骗.本节将介绍Arpspoof工具的 使用. 9.8.1 URL流量操 ...

  6. 一种基于openflow的虚拟化层软件flowvisor的API测试

    注明:本文并不对openflow进行分析,本人也是略略知道这个概念,对flowvisor也只是对其API有所测试,更深的源码并未涉及,只是希望该文能对以后的flowvisor研究者提供些许帮助. 一: ...

  7. BZOJ1969: [Ahoi2005]LANE 航线规划(LCT)

    Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 587  Solved: 259[Submit][Status][Discuss] Description ...

  8. linux脚本运行错误:$'ls\r': command not found

    原因在于 windows 下的换行符是 \r\n,而 linux 下的换行符是 \n 解决方案: 首先运行如下命令安装 dos2unix: yum install dos2unix -y 接下来运行如 ...

  9. $.post({})请求springmvc -5.x 的方法,没有 返回数据的情况

    转载请注明出处,毕竟调试了一天 今天用$.post({})传递参数,账号和密码来验证登录,验证成功返回1,验证不成功返回0,结果,$.post({}),的回调函数一直无法执行,但是原来是可以的,不重大 ...

  10. spark+phoenix

    phoenix作为查询引擎,为了提高查询效率,为phoenix表创建了二级索引,而数据是sparkstreaming通过hbase api直接向hbase插数据.那么问题来了,对于phoenix的二级 ...