bzoj5369 [Pkusc2018]最大前缀和
题目描述:
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]最大前缀和相关推荐
- Luogu5369 [PKUSC2018]最大前缀和
题目链接:洛谷 题目大意:给定一个长为$n$的整数序列,求全排列的最大前缀和(必须包含第一个数)之和. 数据范围:$1\leq n\leq 20,1\leq \sum_{i=1}^n|a_i|\leq ...
- bzoj 5369: [Pkusc2018]最大前缀和
Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于是小C决定把序列随机打乱,然后取序列的最大前缀和作为答案. 小C ...
- 「PKUSC2018」星际穿越 (70分做法)
5371: [Pkusc2018]星际穿越 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 27 Solved: 11 [Submit][Statu ...
- 胡小兔的 PKUSC2018 游记
Day 0 一番纠结之后,我还是选择了 PKUSC (Penguin Kingdom University Summer Camp, 企鹅王国大学夏令营)! 理由?扔硬币决定的理由如下: PKU好啊 ...
- Redis 笔记(13)— scan 和 keys 寻找特定前缀key 字段(命令格式、使用示例、定位大key)
1. keys Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key. 127.0.0.1:6379> keys * (empty array) 127. ...
- OpenCV 笔记(04)— OpenCV2 升级到 OpenCV3/CV4 的改动(去掉 CV_前缀、使用新的前缀替换、使用新的命名空间宏)
1. 由于宏名称的变更照成的"未声明的标识符"系列问题 有时候,遇到此类问题加入一句 #include <cv.h> 便可以让 OpenCV3 或者 OpenCV4 也 ...
- Go 学习笔记(59)— Go 第三方库之 etcd/clientv3 封装为方法使用(建立连接、设置key-value、获取key-value、获取带前缀的key-value)
1. 示例 1 package main import ("context""fmt""go.etcd.io/etcd/clientv3"& ...
- LeetCode简单题之检查字符串是否为数组前缀
题目 给你一个字符串 s 和一个字符串数组 words ,请你判断 s 是否为 words 的 前缀字符串 . 字符串 s 要成为 words 的 前缀字符串 ,需要满足:s 可以由 words 中的 ...
- LeetCode简单题之检查单词是否为句中其他单词的前缀
题目 给你一个字符串 sentence 作为句子并指定检索词为 searchWord ,其中句子由若干用 单个空格 分隔的单词组成. 请你检查检索词 searchWord 是否为句子 sentence ...
- CSS3无前缀脚本prefixfree.js与Animatable使用介绍
要求 必备知识 本文要求基本了解 JAVASCRIPT 和 和 CSS3 基本知识. 运行环境 桌面端:IE9 +,Opera 10+,火狐3.5 +,Safari 4+和Chrome浏览器;移动端: ...
最新文章
- leetcode001 two_Sum
- 安卓下拉刷新、上拉加载数据显示
- JAVA 设计模式 享元模式
- python绘制3d图形-Python基于matplotlib实现绘制三维图形功能示例
- DELL服务器利用OMSA修改BIOS设置
- 使用数值计算库Zero - VC6调用失败、cfree调用成功
- 密码(图解密码技术)_第一章_环游密码世界总结
- rails 2.3.5 + jquery ui datepicker 不能显示中文
- ifix从sqlserver里读数据_国外自动化组态软件介绍:InTouch|WinCC|iFix|Citect
- excel文件修复工具_七款免费的PDF处理工具
- 最简单DIY基于STM32F407探索者开发板和PCA9685舵机控制模块的红外遥控机械臂控制程序
- JavaWeb开发框架——Spring
- 【pytorch】Conv2d()里面的参数bias什么时候加,什么时候不加?
- 吉林省教育学院学报杂志社吉林省教育学院学报编辑部2022年第9期目录
- windows专业版以上使用自带远程连接(不限制于局域网)
- pyttsx3 语音包安装、使用详解
- Ensight 基本操作
- python编写的储存单位转换代码(以字节(B)为单位)
- 30种常见补肾食物,不看绝对会后悔
- C++中的数组初始化