题目描述:

bz

luogu

题解:

不带组合数玩的计数问题。

先只考虑最大前缀和大于$0$的情况。

首先对于一个数列,他的最大前缀和有一个性质,即(高能预警):

(分割线的意思是满足该线左边为最大前缀的,最靠左的分割线)

分割线左边的数列,任意后缀都必须$>0$;

分割线右边的数列,任意前缀都必须$\leq 0$。

这样满足最大。

所以状压一波,转移可以按照在当前状态后边(或者前边)再接一个数来转移。

然后我脑残一交发现只有$55$。

后来注意到前缀必须从$1$开始,就发现大事不妙。

其实也很简单。当$sum  = \sum a_i < 0$时会出现负的最大前缀。

怎么算呢?

这个最大前缀和还有一个性质:

分割线左边的每一个后缀(除了整个前缀)都$>0$;

分割线右边的每一个前缀都$\leq 0$。

所以左边第一位(即开头)一定是负数,然后左边第二位到分割线和分割线右边的状态数我们已经算完了。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 22;
const int M = (1<<20)+50;
const int MOD = 998244353;
template<typename T>
inline void read(T&x)
{T f = 1,c = 0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();}x = f*c;
}
int n;
ll a[N],ans;
void Mod(ll&x){if(x>=MOD)x-=MOD;}
ll cot[M],_id[M];
ll c0[M],c1[M];//<= >
int main()
{
//    freopen("tt.in","r",stdin);read(n);int MX = (1<<n)-1;ll sum = 0;for(int i=0;i<n;i++)read(a[i]),_id[1<<i]=i,sum+=a[i];for(int i=1;i<(1<<n);i++)cot[i]=cot[i^(i&-i)]+a[_id[i&-i]];c0[0]=c1[0]=1;for(int i=0;i<(1<<n);i++)for(int j=0;j<n;j++)if(!(i&(1<<j))){if(cot[i]+a[j]<=0)Mod(c0[i|(1<<j)]+=c0[i]);else Mod(c1[i|(1<<j)]+=c1[i]);}for(int i=0;i<(1<<n);i++)Mod(ans+=c0[i]*c1[MX^i]%MOD*cot[MX^i]%MOD);if(sum<0){for(int i=0;i<(1<<n);i++)if(!i||cot[i]>0)for(int j=0;j<n;j++)if(!(i&(1<<j))&&cot[i]+a[j]<0)Mod(ans+=c1[i]*c0[MX^(i|(1<<j))]%MOD*(MOD+cot[i]+a[j])%MOD);}printf("%lld\n",ans);return 0;
}

View Code

转载于:https://www.cnblogs.com/LiGuanlin1124/p/10872864.html

bzoj5369 [Pkusc2018]最大前缀和相关推荐

  1. Luogu5369 [PKUSC2018]最大前缀和

    题目链接:洛谷 题目大意:给定一个长为$n$的整数序列,求全排列的最大前缀和(必须包含第一个数)之和. 数据范围:$1\leq n\leq 20,1\leq \sum_{i=1}^n|a_i|\leq ...

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

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

  3. 「PKUSC2018」星际穿越 (70分做法)

    5371: [Pkusc2018]星际穿越 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 27  Solved: 11 [Submit][Statu ...

  4. 胡小兔的 PKUSC2018 游记

    Day 0 一番纠结之后,我还是选择了 PKUSC (Penguin Kingdom University Summer Camp, 企鹅王国大学夏令营)! 理由?扔硬币决定的理由如下: PKU好啊 ...

  5. Redis 笔记(13)— scan 和 keys 寻找特定前缀key 字段(命令格式、使用示例、定位大key)

    1. keys Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key. 127.0.0.1:6379> keys * (empty array) 127. ...

  6. OpenCV 笔记(04)— OpenCV2 升级到 OpenCV3/CV4 的改动(去掉 CV_前缀、使用新的前缀替换、使用新的命名空间宏)

    1. 由于宏名称的变更照成的"未声明的标识符"系列问题 有时候,遇到此类问题加入一句 #include <cv.h> 便可以让 OpenCV3 或者 OpenCV4 也 ...

  7. Go 学习笔记(59)— Go 第三方库之 etcd/clientv3 封装为方法使用(建立连接、设置key-value、获取key-value、获取带前缀的key-value)

    1. 示例 1 package main import ("context""fmt""go.etcd.io/etcd/clientv3"& ...

  8. LeetCode简单题之检查字符串是否为数组前缀

    题目 给你一个字符串 s 和一个字符串数组 words ,请你判断 s 是否为 words 的 前缀字符串 . 字符串 s 要成为 words 的 前缀字符串 ,需要满足:s 可以由 words 中的 ...

  9. LeetCode简单题之检查单词是否为句中其他单词的前缀

    题目 给你一个字符串 sentence 作为句子并指定检索词为 searchWord ,其中句子由若干用 单个空格 分隔的单词组成. 请你检查检索词 searchWord 是否为句子 sentence ...

  10. CSS3无前缀脚本prefixfree.js与Animatable使用介绍

    要求 必备知识 本文要求基本了解 JAVASCRIPT 和 和 CSS3 基本知识. 运行环境 桌面端:IE9 +,Opera 10+,火狐3.5 +,Safari 4+和Chrome浏览器;移动端: ...

最新文章

  1. leetcode001 two_Sum
  2. 安卓下拉刷新、上拉加载数据显示
  3. JAVA 设计模式 享元模式
  4. python绘制3d图形-Python基于matplotlib实现绘制三维图形功能示例
  5. DELL服务器利用OMSA修改BIOS设置
  6. 使用数值计算库Zero - VC6调用失败、cfree调用成功
  7. 密码(图解密码技术)_第一章_环游密码世界总结
  8. rails 2.3.5 + jquery ui datepicker 不能显示中文
  9. ifix从sqlserver里读数据_国外自动化组态软件介绍:InTouch|WinCC|iFix|Citect
  10. excel文件修复工具_七款免费的PDF处理工具
  11. 最简单DIY基于STM32F407探索者开发板和PCA9685舵机控制模块的红外遥控机械臂控制程序
  12. JavaWeb开发框架——Spring
  13. 【pytorch】Conv2d()里面的参数bias什么时候加,什么时候不加?
  14. 吉林省教育学院学报杂志社吉林省教育学院学报编辑部2022年第9期目录
  15. windows专业版以上使用自带远程连接(不限制于局域网)
  16. pyttsx3 语音包安装、使用详解
  17. Ensight 基本操作
  18. python编写的储存单位转换代码(以字节(B)为单位)
  19. 30种常见补肾食物,不看绝对会后悔
  20. C++中的数组初始化

热门文章

  1. 手算KMP算法next数组
  2. 解读LED灯具中国能效认证
  3. 二元函数偏导数的几何意义
  4. 二元隐函数求二阶偏导_二元隐函数的二阶偏导数的计算方法
  5. Intel CPU发展史
  6. 利用R语言进行具有周期性的时间序列分析
  7. php源码网站安装教程,php源码安装教程(php源码网站搭建方法和过程)
  8. Python 珍藏函数超详解:随机抽样,分层抽样,系统抽样方法汇总
  9. 【Spring】Spring使用xml注入为属性赋值
  10. nvme SSD和sata SSD的对比