• 上午的国庆大阅兵有意思

Description

  https://loj.ac/problem/6433

Solution

  看数据范围认解法

  首先在每种情况出现概率相同的情况下, \(期望 \times 方案数 = 权值和\),即题意就是让你求所有排列的最大前缀和的总和……

  我们可以枚举哪些数是最大前缀,显然这些数内部任意交换顺序、其它数内部任意交换顺序 都不会改变这个最大前缀。

  一些数要排到前面去成为最大前缀,条件是该前缀除整段外的所有后缀和 \(\gt 0\)(因为最大前缀长度不能是 \(0\)),后面的所有前缀和 \(\le 0\)。

  (一个 \(\gt 0\),一个 \(\le 0\) 是因为对于一种排列,若有多个前缀和均为最大,我们只根据最短的前缀统计一次该排序。也可以根据最长的前缀,即一个 \(\ge 0\),一个 \(\lt 0\))

  设 \(f(i)\) 表示集合 \(i\) 的数有多少种排列满足所有后缀和 \(\gt 0\),\(g(i)\) 表示集合 \(i\) 的数有多少种排列满足所有前缀和 \(\le 0\)。

  \(f\) 的转移是每次往前加一个数,\(g\) 的转移是每次往后加一个数。加一个数只需要判断一下新后/前缀和是否满足条件。

  最后把 \(f\) 和 \(g\) 卷起来就好了。

#include<bits/stdc++.h>
#define ll long long
#define N 1048580
#define mod 998244353
using namespace std;
inline int read(){
int x=0; bool f=1; char c=getchar();
for(;!isdigit(c); c=getchar()) if(c=='-') f=0;
for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
if(f) return x; return 0-x;
}
int n,nn,f[N],g[N],ans; ll sum[N];
inline int lowbit(int x) {return x&-x;}
inline void upd(int &x, int y) {x = (x+y) % mod;}
int main(){
n=read(), nn=(1<<n)-1;
for(int i=0; i<n; ++i) sum[1<<i]=read();
for(int i=1; i<=nn; ++i){
int x=lowbit(i);
if(i^x) sum[i]=sum[i^x]+sum[x];
}
for(int i=0; i<n; ++i) f[1<<i]=1;
for(int i=1; i<=nn; ++i) if(sum[i]>0)
for(int j=0; j<n; ++j) if((i&(1<<j))==0)
upd(f[i^(1<<j)], f[i]);
//for(int i=0; i<=nn; ++i) cout<<f[i]<<' '; cout<<endl;
g[0]=1;
for(int i=0; i<=nn; ++i)
for(int j=0; j<n; ++j) if((i&(1<<j))==0 && sum[i^(1<<j)]<=0)
upd(g[i^(1<<j)], g[i]);
//for(int i=0; i<=nn; ++i) cout<<g[i]<<' '; cout<<endl;
for(int i=1; i<=nn; ++i)
upd(ans, (ll)f[i]*g[nn^i]%mod*((sum[i]%mod+mod)%mod)%mod);
cout<<ans<<endl;
return 0;
}

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

  1. [PKUSC2018]最大前缀和

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

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

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

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

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

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

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

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

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

  6. BZOJ5369 [Pkusc2018]最大前缀和

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

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

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

  8. [PKUSC2018]最大前缀和(DP)

    题意:求一个序列随机打乱后最大前缀和的期望. 考场上发现不管怎么设状态都写不出来,实际上只要稍微转换一下就好了. 一个前缀[1..k]是最大前缀,当且仅当前面的所有后缀[k-1,k],[k-2,k], ...

  9. P5369 [PKUSC2018]最大前缀和

    状态压缩 P5369 题意:求所有排列下的最大前缀和之和 一步转化: 求最大前缀和的前缀由数集S组成的方案数, 统计答案时直接乘上sum(S)即可 考虑最大前缀和的性质: 设最大前缀和为sum[i] ...

  10. 【洛谷5369】[PKUSC2018] 最大前缀和(状压DP)

    点此看题面 大致题意: 对于一个序列,求全排列下最大前缀和之和. 状压\(DP\) 考虑如果单纯按照题目中对于最大前缀和的定义,则一个序列它的最大前缀和是不唯一的. 为了方便统计,我们姑且规定,如果一 ...

随机推荐

  1. Leetcode刷题5—最大子序和

    一.题目要求 二.题目背景 动态规划(英语:Dynamic programming,简称 DP)是一种在数学.管理科学.计算机科学.经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式 ...

  2. linux-关闭文件

    1.打开参考: http://q.cnblogs.com/q/39275/ http://hi.baidu.com/auxor/item/49b6e929fdf16dc7ed10f197 2.关闭参考 ...

  3. PostgreSQL 循环导出schema的脚本

    需要备份的schema列表 $ cat need_backup_schema.txt pipeline_na_16q3_v4 pipeline_na_16q4_v8 pipeline_na_16q4_ ...

  4. 从入门到自闭之Python--MySQL数据库的操作命令

    命令: mysqld install; 配置数据库 net start mysql;启动数据库 mysql -uroot -p; 以root权限启动数据库,-p之后输入密码 mysql -uroot ...

  5. [转载]Python 魔法方法详解

    据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切. 他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个, ...

  6. Redis客户端相关

    1.redis是什么 redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库.redis的官网地址,非常好记,是redis.io.目前,Vmware在 ...

  7. Jmeter之参数化(4种设置方法)

    以多用户登录为例~~~ 参数化: 1.用户参数 2.CSV数据文件 3.函数助手CSVRead 4.用户自定义的变量 1.用户参数 脚本目录结构如下: 因为设置了2组账号密码,所以线程数设置为2(添加 ...

  8. python安装OpenCV后import cv2报错解决办法

    现在python安装完成后,运行pip install opencv-python安装成功后,import cv2时会失败 看到有人给出下载https://www.lfd.uci.edu/~gohlk ...

  9. 怎样理解NodeList的动态集合与静态集合

    NodeList 有两种, 一种是动态集合, 一种是静态集合, 所谓动态集合, 主要是 Node.prototype.childNodes; 返回的子节点集合对文档的节点增删改会即时改变; 而静态集合 ...

  10. centos 服务器 发开防火墙端口

    一.概述 在服务器上手动安装了某个软件,需要通过外部访问该软件(有对外开放端口),但是此时访问不通,此时检查,发现是该端口没有在防火墙开放,因此外界访问不了该服务器上的该软件对外提供的功能,基于此,需 ...