【PKUSC2018】【loj6433】最大前缀和 状压dp
这题吼啊...
然而还是想了$2h$,写了$1h$。
我们发现一个性质:若一个序列$p$能作为前缀和,那么在序列$p$中,包含序列$p$最后一个数的所有子序列必然都是非负的。
那么,我们
令$f[i]$表示状态$i$中所有数字全部作为前缀和的方案数。
令$g[i]$表示状态$i$中所有数字所组合成的任意排列中,前缀和永远为负数的方案数。
令$s[i]$表示状态$i$中所有数字之和。
ps:若i的第j个二进制位为$1$,则表示状态$i$中,选择了数字$a_j$。($a$序列的下表为$0$到$n-1$)
通过冷静分析,不难得出:
$s[i]$很好求
$f[i]=\sum_{(2^j\ and\ i)=2^j∩s[i-2^j]+a[j]≥0} f[i-2^j]$
$g[i]=\sum_{(2^j\ and\ i)=2^j∩s[i-2^j]+a[j]<0} g[i-2^j]$
显然$f[0]=g[0]=1$。
统计答案时,分前缀和$≥0$,前缀和$<0$两类讨论。
当前缀和$≥0$时
$ans1=\sum_{i=1}^{2^n-1} s[i] \times f[i] \times g[2^n-1-i] $
当前缀和<0时
$ans2=\sum_{j=0}^{n=1} \sum_{i=0} (a[j]+s[i])\times f[i]\times g[2^n-1-i-2^j]\ \ \ [(2^j\ and\ i=0)∩s[i]<0∩s[i]>-a[j]]$
最终所求答案即$ans1+ans2$。
然后就完结了。
时间复杂度为$O(n \times 2^n)$。
#include<bits/stdc++.h>
#define M 20
#define L long long
#define MOD 998244353
using namespace std; L f[<<M]={},g[<<M]={},a[M]={},he[<<M]={}; int main(){
int n,m; scanf("%d",&n); m=<<n;
for(int i=;i<n;i++) cin>>a[i];
for(int i=;i<m;i++)
for(int j=;j<n;j++)
if(i&(<<j)) he[i]+=a[j];
f[]=;
for(int i=;i<m;i++){
for(int j=;j<n;j++)
if((i&(<<j))&&he[i^(<<j)]+a[j]>=){
f[i]=(f[i]+f[i^(<<j)])%MOD;
}
}
for(int i=;i<n;i++) a[i]=-a[i];
for(int i=;i<m;i++) he[i]=-he[i];
g[]=;
for(int i=;i<m;i++){
for(int j=;j<n;j++)
if((i&(<<j))&&he[i^(<<j)]+a[j]>){
g[i]=(g[i]+g[i^(<<j)])%MOD;
}
}
for(int i=;i<n;i++) a[i]=-a[i];
for(int i=;i<m;i++) he[i]=-he[i];
L ans=;
for(int j=;j<n;j++) if(a[j]<){
//f[1<<j]=1;
for(int i=;i<m;i++)
if((i&(<<j))==){
if(he[i]<||he[i]>-a[j]) continue;
int hh=(m-)^i^(<<j);
ans=(ans+(a[j]+he[i])*f[i]%MOD*g[hh]%MOD+MOD)%MOD;
}
}
for(int i=;i<m;i++)
ans=(ans+f[i]*he[i]%MOD*g[(m-)^i]%MOD+MOD)%MOD;
cout<<ans<<endl;
}
【PKUSC2018】【loj6433】最大前缀和 状压dp的更多相关文章
- LOJ#6433. 「PKUSC2018」最大前缀和 状压dp
原文链接https://www.cnblogs.com/zhouzhendong/p/LOJ6433.html 题解 枚举一个集合 S ,表示最大前缀和中包含的元素集为 S ,然后求出有多少个排列是这 ...
- LOJ 6433 「PKUSC2018」最大前缀和——状压DP
题目:https://loj.ac/problem/6433 想到一个方案中没有被选的后缀满足 “该后缀的任一前缀和 <=0 ”. 于是令 dp[ S ] 表示选了点集 S ,满足任一前缀和 & ...
- [PKUSC2018]最大前缀和——状压DP
题目链接: [PKUSC2018]最大前缀和 设$f[S]$表示二进制状态为$S$的序列,任意前缀和都小于等于$0$的方案数. 设$g[S]$表示二进制状态为$S$的序列是整个序列的最大前缀和的方案数 ...
- BZOJ5369:[PKUSC2018]最大前缀和(状压DP)
Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于是小C决定把序列随机打乱,然后取序列的最大前缀和作为答案. 小C ...
- BZOJ_5369_[Pkusc2018]最大前缀和_状压DP
BZOJ_5369_[Pkusc2018]最大前缀和_状压DP Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于 ...
- 「PKUSC2018」最大前缀和(状压dp)
前言 考试被\(hyj\)吊着打... Solution 考虑一下如果前缀和如果在某一个位置的后面的任意一个前缀和都<=0,肯定这就是最大的. 然后这样子就考虑左右两边的状压dp,然后就好了. ...
- Loj 6433. 「PKUSC2018」最大前缀和 (状压dp)
题面 Loj 题解 感觉挺难的啊- 状压\(dp\) 首先,有一个性质 对于一个序列的最大前缀和\(\sum_{i=1}^{p} A[i]\) 显然对于每个\(\sum_{i=p+1}^{x}A[i] ...
- 【洛谷5369】[PKUSC2018] 最大前缀和(状压DP)
点此看题面 大致题意: 对于一个序列,求全排列下最大前缀和之和. 状压\(DP\) 考虑如果单纯按照题目中对于最大前缀和的定义,则一个序列它的最大前缀和是不唯一的. 为了方便统计,我们姑且规定,如果一 ...
- T2988 删除数字【状压Dp+前缀和优化】
Online Judge:从Topcoder搬过来,具体哪一题不清楚 Label:状压Dp+前缀和优化 题目描述 给定两个数A和N,形成一个长度为N+1的序列,(A,A+1,A+2,...,A+N-1 ...
随机推荐
- 2018.10.13 bzoj1070: [SCOI2007]修车(费用流)
传送门 费用流经典题目. 自我感觉跟TheWindy′sThe Windy'sTheWindy′s很像. 利用费用提前计算的思想来建图就行了. 代码: #include<bits/stdc++. ...
- 2018.09.08 bzoj1151: [CTSC2007]动物园zoo(状压dp)
传送门 状压dp好题啊. 可以发现这道题的状压只用压缩5位. f[i][j]表示当前在第i个位置状态为j的最优值. 显然可以由f[i-1]更新过来. 因此只用预处理在第i个位置状态为j时有多少个小朋友 ...
- hdu-1140(求距离,精度判断)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1140 思路:卫星只能消灭地面上一部分的风暴,即风暴与卫星的距离最大是卫星到地球的切线的距离,大于这个距 ...
- POJ 3320 Jessica's Reading Problem (滑动窗口)
题意:给定一个序列,求一个最短区间,使得这个区间包含所有的种类数. 析:最近刚做了几个滑动窗口的题,这个很明显也是,肯定不能暴力啊,时间承受不了啊,所以 我们使用滑动窗口来解决,要算出所有的种数,我用 ...
- trsd_extract_EDSD_new
# -*- coding:utf-8 -*- import re ''' 适应新版本 ''' year='17A'#用户自定义 ss='./data/'#根目录 filename = ss+'EDSD ...
- Android绘图板的开发
>>继承自View >>使用Canvas绘图 每次View组件上的图形状态数据发生了改变,都应该通知View组件重写调用onDraw(Canvas canvas)方法重绘该组件 ...
- 3D UI场景中,把XY平面的尺寸映射为屏幕像素的数学模型推导
概述及目录(版权所有,请勿转载,欢迎读者提出错误) 之前用kanzi的3D UI引擎和cocos-2d的时候都有遇到过这个问题,就如何把3D场景中的XY平面的尺寸映射为与屏幕像素一一对应的,即XY平面 ...
- jvm不打印异常栈
生产环境抛异常,但却没有将堆栈信息输出到日志,确认打印日志方法正确logger.error("somthing error", ex); JVM启动参数加上-XX:-OmitSta ...
- 【Linux】文件操作系统调用
一. 文件描述符 在Linux下使用文件描述符来表示设备文件和普通文件.文件描述符是一个整型的数据,所有对文件的操作都通过文件描述符实现.文件描述符的范围是0~OPEN_MAX,系统中有3个已经分配的 ...
- Time&Patience
“时间和耐心,是世间最强大的两个勇士.” “对未来越有信心,对今天越有耐心,坚持做正确的事.” 每日必做清单 每天六组俯卧撑 活在当下 接收脆弱 一万小时理论(罗马不是一天建成的,胖 ...