题解

神仙的状压啊QAQ

设一个\(f[S]\)表示数字的集合为\(S\)时\(sum[S]\)为前缀最大值的方案数

\(g[S]\)表示数字集合为\(S\)时所有前缀和都小于等于0的方案数

答案就是\(sum_{S} sum[S] * f[S] * g[2^{N} - 1 - S]\)

求\(f\)每次相当于往前面插入一个数,如果\(sum[S] > 0\)就更新

\(f[S \^ (1 << i - 1)] += f[S] (sum[S] > 0)\)

求\(g\)只要每次看看更新的集合总和是不是合法就行了

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int MOD = 998244353;
int N;
int A[25],sum[(1 << 20) + 5],pos[(1 << 20) + 5],f[(1 << 20) + 5],g[(1 << 20) + 5],ans;
int inc(int a,int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
int lowbit(int x) {
return x & (-x);
}
void update(int &x,int y) {
x = inc(x,y);
}
void Solve() {
read(N);
for(int i = 1 ; i <= N ; ++i) read(A[i]);
for(int i = 0 ; i < N ; ++i) pos[1 << i] = i + 1;
for(int S = 1 ; S < (1 << N) ; ++S) {
sum[S] = sum[S ^ lowbit(S)] + A[pos[lowbit(S)]];
}
g[0] = 1;
for(int i = 1 ; i <= N ; ++i) {
f[1 << i - 1] = 1;
}
for(int S = 1 ; S < (1 << N) ; ++S) {
if(sum[S] > 0) {
for(int i = 1 ; i <= N ; ++i) {
if(!(S >> (i - 1) & 1)) {
update(f[S ^ (1 << i - 1)],f[S]);
}
}
}
else {
for(int i = 1 ; i <= N ; ++i) {
if(S >> (i - 1) & 1) {
update(g[S],g[S ^ (1 << i - 1)]);
}
}
}
}
for(int S = 1 ; S < (1 << N) ; ++S) {
int t = mul(f[S],g[(1 << N) - 1 - S]);
t = mul(t,inc(MOD,sum[S]));
update(ans,t);
}
out(ans);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

最新文章

  1. 在Javascript中onclick()方法应用
  2. yii gii自动生成的curd添加批量删除实例
  3. GoLang之基础
  4. 第二个UI脚本--Python+selenium之unittest+HTMLtestRunner及python的继承
  5. C#--对象的相等比较
  6. 未知宽高div水平垂直居中3种方法
  7. 写个脚本列出neutron的ovs的topology。
  8. Mysql 忘密码 + Phpadmin 修改密码无法登陆
  9. 理解Javascript的动态语言特性
  10. dddquickly
  11. [HTML]音乐自动播放(兼容微信)
  12. 架构(三)MongoDB安装配置以及集群搭建
  13. 翻译:DECLARE Variable(已提交到MariaDB官方手册)
  14. [转帖]wifi 4G 和 蓝牙的区别
  15. ProxySQL+MGR实现读写分离和主节点故障无感知切换 - 完整操作记录
  16. HDU4403-模拟、数学
  17. Oracle——环比增长率
  18. 2019 wannafly winter camp
  19. 顶点纹理shader
  20. c# 多线程之-- System.Threading Timer的使用

热门文章

  1. 【转】I2C总线协议
  2. java基础知识疑难点
  3. 解题:CF1118F2 Tree Cutting (Hard Version)
  4. 解题:HNOI 2014 世界树
  5. vue-cli内部webpack的打包优化
  6. Spark记录-scala快速入门
  7. SQL语句(十四)子查询
  8. html5 canvas裁剪区域
  9. jQuery中Animate进阶用法(二)
  10. TED_Topic7:How we unearthed the spinosaurus