「PKUSC2018」最大前缀和 LOJ#6433&BZOJ5369
分析:
这个题非常的棒,目测如果去了能AC...
我们考虑一个序列是如何构成的——一个后缀>0的序列,和一个前缀<0的序列
问题可以简化为求出当前缀和为状态S的所有数的和的时候,S满足后缀>=0的方案数和((1<<n)-1)^S满足前缀<0的方案数
那么可以写出方程,sum[S]表示状态S的和,f[S]表示由S构成的序列满足所有后缀>=0的方案数,g[S]表示由S构成的序列满足所有前缀<0的方案数
转移:f[S]=(f[S]+f[S^(1<<i-1)]),g[S]=(g[S]+g[S^(1<<i-1)])具体特判看代码。
注意:f[S]表示的一定是>=0,=不能省,很关键。不然的话,状态会缺很多。
神题,目测区分度很大...相比之下,比T1不知道高到哪里去了...
外加上Orz tangyunkai1 230虐场,(估计我也就200...T3还是爆弹去吧...),有学上了...
附上代码:
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <queue>
#include <cstdlib>
#include <cstring>
using namespace std;
#define N 21
#define M 1<<20
#define ll long long
#define mod 998244353
ll f[M],g[M],sum[M];
int n,a[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),f[1<<(i-1)]=1;
f[0]=1,g[0]=1,sum[0]=0;
for(int S=1;S<(1<<n);S++)
{
for(int i=1;i<=n;i++)
{
if(S&(1<<(i-1)))
{
sum[S]=sum[S^(1<<(i-1))]+a[i];
break;
}
}
}
for(int S=1;S<(1<<n);S++)
{
for(int i=1;i<=n;i++)
{
if(!(S&(1<<(i-1))))continue;
int s=S^(1<<(i-1));
if(sum[s]<=0)continue;
f[S]=(f[s]+f[S])%mod;
}
if(sum[S]<=0)
{
for(int i=1;i<=n;i++)
{
if(!(S&(1<<(i-1))))continue;
int s=(S^(1<<(i-1)));
g[S]=(g[S]+g[s])%mod;
}
}
}
ll ans=0;
for(int S=1;S<(1<<n);S++)
{
//printf("%d %d %d %d\n",S,sum[S],f[S],g[((1<<n)-1)^S]);
ans=(ans+(sum[S]*f[S]%mod*g[((1<<n)-1)^S])%mod)%mod;
}
printf("%lld\n",(ans%mod+mod)%mod);
return 0;
}
「PKUSC2018」最大前缀和 LOJ#6433&BZOJ5369的更多相关文章
- LOJ 6433 「PKUSC2018」最大前缀和——状压DP
题目:https://loj.ac/problem/6433 想到一个方案中没有被选的后缀满足 “该后缀的任一前缀和 <=0 ”. 于是令 dp[ S ] 表示选了点集 S ,满足任一前缀和 & ...
- Loj#6433「PKUSC2018」最大前缀和(状态压缩DP)
题面 Loj 题解 先转化题意,其实这题在乘了\(n!\)以后就变成了全排列中的最大前缀和的和(有点拗口).\(n\leq20\),考虑状压\(DP\) 考虑一个最大前缀和\(\sum\limits_ ...
- Loj 6433. 「PKUSC2018」最大前缀和 (状压dp)
题面 Loj 题解 感觉挺难的啊- 状压\(dp\) 首先,有一个性质 对于一个序列的最大前缀和\(\sum_{i=1}^{p} A[i]\) 显然对于每个\(\sum_{i=p+1}^{x}A[i] ...
- LOJ#6433. 「PKUSC2018」最大前缀和 状压dp
原文链接https://www.cnblogs.com/zhouzhendong/p/LOJ6433.html 题解 枚举一个集合 S ,表示最大前缀和中包含的元素集为 S ,然后求出有多少个排列是这 ...
- 【LOJ】#6433. 「PKUSC2018」最大前缀和
题解 神仙的状压啊QAQ 设一个\(f[S]\)表示数字的集合为\(S\)时\(sum[S]\)为前缀最大值的方案数 \(g[S]\)表示数字集合为\(S\)时所有前缀和都小于等于0的方案数 答案就是 ...
- loj 6433 「PKUSC2018」最大前缀和 题解【DP】【枚举】【二进制】【排列组合】
这是个什么集合DP啊- 想过枚举断点但是不会处理接下来的问题了- 我好菜啊 题目描述 小 C 是一个算法竞赛爱好者,有一天小 C 遇到了一个非常难的问题:求一个序列的最大子段和. 但是小 C 并不会做 ...
- 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\}$的期望,乘 ...
- 「PKUSC2018」最大前缀和(状压dp)
前言 考试被\(hyj\)吊着打... Solution 考虑一下如果前缀和如果在某一个位置的后面的任意一个前缀和都<=0,肯定这就是最大的. 然后这样子就考虑左右两边的状压dp,然后就好了. ...
随机推荐
- (1)H5实现音乐播放器【正在播放-歌词篇】
近期闲来无事,就想着复习一下前端的东西,然后正好跟朋友搞了一个公共开放的音乐api接口,就想着写一个音乐播放器玩玩! 话不多说,直接上图,然后上代码 [播放器显示正在播放] 实现功能: 1:歌词随着歌 ...
- 网页CSS中*{margin:0; padding:0;}有什么用
* 这东西叫“通配符”用来匹配页面上所有元素.*{margin:0; padding:0;} 像 2L 所说,body ,ul, li ,p,h1~h6,dd,dt 等……都有默认的margin 或p ...
- HTML5+CSS (简易nav设计)
HTML部分: <!DOCTYPE html><html> <head> <title></title> <meta charset= ...
- SQLServer 学习笔记之超详细基础SQL语句 Part 5
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 4------------------- 21使用默认 默认(也称默认值 ...
- AutoCompleteTextView 自定义提示样式
项目中用到AutoCompleteTextView 自动提示功能,如果用自带的ArrayAdapter就一种样式,非常丑,而且每一项提示文字过多的话不会自动换行. 所以自己自定义了一个适配器. 效果 ...
- Expo大作战(十八)--expo如何发布成独立应用程序,打包成apk或者ipa,发布到对应应用商店
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- 在 Windows 上创建虚拟机规模集和部署高度可用的应用
利用虚拟机规模集,可以部署和管理一组相同的.自动缩放的虚拟机. 可以手动缩放规模集中的 VM 数,也可以定义规则,以便根据资源使用情况(如 CPU 使用率.内存需求或网络流量)进行自动缩放. 在本教程 ...
- Eclipse+Weblogic 12开发简单的Enterprise Application
学到EJB方面的内容,遇到了很多问题,翻阅了无数遍Java EE和Weblogic的官方文档,在google上进行了无数次搜索都没有答案,可能我要找的答案太冷门.这一切都起源于Java EE官方文档里 ...
- 【Git】从服务器搭建到提交分支使用——初学者轻松上手篇
GitHub就是一个免费托管开源代码的远程仓库,个人可以把代码寄存处上面,不过会被公开.对于商业公司来说在Linux上搭建一台Git服务器作为私有仓库使用.开发人员在本地下载仓库代码,协同开发.本篇介 ...
- 转:js小技巧 ,将彻底屏蔽鼠标右键,可用于Table ,取消选取、防止复制,IE地址栏前换成自己的图标
1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键<table border oncontextmenu= ...