Loj#6433「PKUSC2018」最大前缀和(状态压缩DP)
题面
题解
先转化题意,其实这题在乘了$n!$以后就变成了全排列中的最大前缀和的和(有点拗口)。$n\leq20$,考虑状压$DP$
考虑一个最大前缀和$\sum\limits_{i=1}^pa_i$,这个位置$p$是最大前缀和的右界当且仅当对于$\forall r>p$有:$\sum\limits_{i=p+1}^ra_i\leq0$
设$sum_i$表示二进制状态$i$的代数和,方便转移
设$g_i$表示选了子集$i$后有多少种排列使得所有的前缀和都$<0$,于是有(从下转移而来):
$$
g[i] += g[i \oplus (1 << j)]\ (sum[i]\leq0,sum[i\oplus(1<<j)]\leq0)
$$
设$f_i$表示选了子集$i$后有多少种排列使得最大前缀和$=sum_i$,于是有(向上转移):
$$
f[i \ | \ (1 << j)]+=f[i]\ (sum[i]>0)
$$
则最后答案就是($m\oplus i$表示$i$的补集):
$$
ans=\sum_{i\in S}sum_i\times f_i \times g_{m\oplus i}
$$
#include <cstdio>
#include <cstring>
#include <algorithm>
using std::min; using std::max;
using std::swap; using std::sort;
typedef long long ll;
template<typename T>
void read(T &x) {
int flag = 1; x = 0; char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') flag = -flag; ch = getchar(); }
while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); x *= flag;
}
const int N = 22, P = 998244353;
int n, m, a[1 << N], f[1 << N], g[1 << N], sum[1 << N], ret;
int lb(int x) { return x & -x; }
int main () {
read(n), m = (1 << n) - 1;
for(int i = 0; i < n; ++i) read(a[1 << i]);
for(int i = 0; i <= m; ++i)
sum[i] = sum[i ^ lb(i)] + a[lb(i)];
g[0] = 1;
for(int i = 0; i < n; ++i) f[1 << i] = 1;
for(int i = 0; i <= m; ++i) {
if(sum[i] <= 0) {
for(int j = 0; j < n; ++j)
if((1 << j) & i && sum[i ^ (1 << j)] <= 0)
(g[i] += g[i ^ (1 << j)]) %= P;
}
}
for(int i = 0; i <= m; ++i) {
if(sum[i] > 0) {
for(int j = 0; j < n; ++j)
if(!((1 << j) & i)) (f[i | (1 << j)] += f[i]) %= P;
}
(ret += 1ll * (sum[i] + P) % P * f[i] % P * g[m ^ i] % P) %= P;
}
printf("%d\n", ret);
return 0;
}
Loj#6433「PKUSC2018」最大前缀和(状态压缩DP)的更多相关文章
- LOJ 6433 「PKUSC2018」最大前缀和——状压DP
题目:https://loj.ac/problem/6433 想到一个方案中没有被选的后缀满足 “该后缀的任一前缀和 <=0 ”. 于是令 dp[ S ] 表示选了点集 S ,满足任一前缀和 & ...
- LOJ#6433. 「PKUSC2018」最大前缀和 状压dp
原文链接https://www.cnblogs.com/zhouzhendong/p/LOJ6433.html 题解 枚举一个集合 S ,表示最大前缀和中包含的元素集为 S ,然后求出有多少个排列是这 ...
- loj 6433 「PKUSC2018」最大前缀和 题解【DP】【枚举】【二进制】【排列组合】
这是个什么集合DP啊- 想过枚举断点但是不会处理接下来的问题了- 我好菜啊 题目描述 小 C 是一个算法竞赛爱好者,有一天小 C 遇到了一个非常难的问题:求一个序列的最大子段和. 但是小 C 并不会做 ...
- Loj 6433. 「PKUSC2018」最大前缀和 (状压dp)
题面 Loj 题解 感觉挺难的啊- 状压\(dp\) 首先,有一个性质 对于一个序列的最大前缀和\(\sum_{i=1}^{p} A[i]\) 显然对于每个\(\sum_{i=p+1}^{x}A[i] ...
- loj#6433. 「PKUSC2018」最大前缀和(状压dp)
传送门 今天\(PKUWC\)试机的题 看着边上的大佬们一个个\(A\)穿咱还是不会-- 我们考虑枚举最大前缀和,如果一个前缀\(1\)到\(p\)是最大前缀和,那么\(p\)后面的所有前缀和都要小于 ...
- [LOJ #6433]「PKUSC2018」最大前缀和
题目大意:给你一个$n(n\leqslant20)$项的数列$A$,设重排后的数列为$A'$,令$pre_p=\sum\limits_{i=1}^pA'_i$,求$max\{pre_i\}$的期望,乘 ...
- 【LOJ】#6433. 「PKUSC2018」最大前缀和
题解 神仙的状压啊QAQ 设一个\(f[S]\)表示数字的集合为\(S\)时\(sum[S]\)为前缀最大值的方案数 \(g[S]\)表示数字集合为\(S\)时所有前缀和都小于等于0的方案数 答案就是 ...
- LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)
题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...
- LOJ #6435. 「PKUSC2018」星际穿越(倍增)
题面 LOJ#6435. 「PKUSC2018」星际穿越 题解 参考了 这位大佬的博客 这道题好恶心啊qwq~~ 首先一定要认真阅读题目 !! 注意 \(l_i<r_i<x_i\) 这个条 ...
随机推荐
- II8部署WCF服务出错
环境:Windows 2012 R2 + IIS 8.0 + .NET 4.5 错误404.3 - Not Found: 控制面板->程序->启用或关闭Windows功能,如下图所示,将需 ...
- mysql 字段为NULL的一些操作
1. 修改字段为NULL update tableName set column1 = null where id = 1 2. 字段是否为NULL (1)字段为空 select * tableNam ...
- java将文件转为UTF8工具类
package hiveTest; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.File ...
- 【BZOJ3769】BST again [DP]
BST again Time Limit: 10 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 求有多少棵大小为n的深度 ...
- zuul进行rate limit
maven <dependency> <groupId>com.marcosbarbero.cloud</groupId> <artifactId>sp ...
- 6.0docker Dockerfile文件
指令格式 #注释 FROM :基础镜像 MAINTAINER:镜像的作者信息 RUN :指定(构建过程中)当前镜像中运行的命令 EXPOSE :指定运行镜像的容器应用程序所使用的端口 容器但不会打开, ...
- 一种通过HTTP传文件出网的姿势
在外网机器上运行文件服务接收服务 root@kali:~/pentest-script/FileTransfer/HttpServer# python3 SimpleHttpUpload.py Ser ...
- perl6中的替换
use v6; =begin pod perl6 中的替换用S/// S有几个可选参数: :g —(长形式::global)全局匹配:替换掉所有的出现 :i —不区分大小写的匹配 :ii —(长形式: ...
- Django【设计】settings方案
配置文件: 目标:配置文件,默认配置和手动配置分开,参考django的配置文件方案,默认配置文件放在内部,只让用户做常用配置 /bin/settings.py(手动配置) PLUGIN_ITE ...
- 自动化测试===unittest和requests接口测试案例,测试快递查询api(二)
在原来基础上生成测试报告: 首先需要 HTMLTestRunner.py 的unittest生成报告文件 (源码,自动化测试===unittest配套的HTMLTestRunner.py生成html ...