【PKUSC2018】最大前缀和】的更多相关文章

[PKUSC2018]最大前缀和 题目大意: 有\(n(n\le20)\)个数\(A_i(|A_i|\le10^9)\).求这\(n\)个数在随机打乱后最大前缀和的期望值与\(n!\)的积在模\(998244353\)意义下的值.其中最大前缀和的定义为\(\forall i\in[1,n]\sum_{j=1}^iA_j\)的最大值. 思路: 考虑一个分界点\(p\),使得\(\sum A_{1\sim p}\)为最大前缀和,那么显然\(p\)之后的所有前缀和均\(<0\),否则就存在可以替换\(…
BZOJ_5369_[Pkusc2018]最大前缀和_状压DP Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于是小C决定把序列随机打乱,然后取序列的最大前缀和作为答案. 小C是一个非常有自知之明的人,他知道自己的算法完全不对,所以并不关心正确率,他只关心求出的解的期望值, 现在请你帮他解决这个问题,由于答案可能非常复杂,所以你只需要输出答案乘上n!后对998244353取模的值,显然这是个整数. 注:最大前…
题目链接: [PKUSC2018]最大前缀和 设$f[S]$表示二进制状态为$S$的序列,任意前缀和都小于等于$0$的方案数. 设$g[S]$表示二进制状态为$S$的序列是整个序列的最大前缀和的方案数. 设$sum[S]$表示二进制状态为$S$的序列的每个数的和. 那么答案就是$\sum\limits_{S=1}^{2^n-1}sum[S]*g[S]*f[(2^n-1)-S]$. 对于$f[S]$,转移相当于在序列前面加一个数,只有当前集合中数的和小于等于$0$时可以转移. 对于$g[S]$,只…
题目分析: 容易想到若集合$S$为前缀时,$S$外的所有元素的排列的前缀是小于$0$的,DP可以做到,令排列前缀个数小于0的是g[S]. 令f[S]表示$S$是前缀,转移可以通过在前面插入元素完成. 代码: #include<bits/stdc++.h> using namespace std; ; ; int n; int a[maxn]; <<],g[<<],sum[<<],arr[<<]; void read(){ scanf("…
Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于是小C决定把序列随机打乱,然后取序列的最大前缀和作为答案. 小C是一个非常有自知之明的人,他知道自己的算法完全不对,所以并不关心正确率,他只关心求出的解的期望值, 现在请你帮他解决这个问题,由于答案可能非常复杂,所以你只需要输出答案乘上n!后对998244353取模的值,显然这是个整数. 注:最大前缀和的定义:i∈[1,n],Sigma(aj)的最大值,其中1<…
题意 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于是小C决定把序列随机打乱,然后取序列的最大前缀和作为答案. 小C是一个非常有自知之明的人,他知道自己的算法完全不对,所以并不关心正确率,他只关心求出的解的期望值, 现在请你帮他解决这个问题,由于答案可能非常复杂,所以你只需要输出答案乘上n!后对998244353取模的值,显然这是个整数. 注:最大前缀和的定义:i∈[1,n],Sigma(aj)的最大值,其中1<=j<=i \(…
Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于是小C决定把序列随机打乱,然后取序列的最大前缀和作为答案. 小C是一个非常有自知之明的人,他知道自己的算法完全不对,所以并不关心正确率,他只关心求出的解的期望值, 现在请你帮他解决这个问题,由于答案可能非常复杂,所以你只需要输出答案乘上n!后对998244353取模的值,显然这是个整数. 注:最大前缀和的定义:i∈[1,n],Sigma(aj)的最大值,其中1<…
题意:求一个序列随机打乱后最大前缀和的期望. 考场上发现不管怎么设状态都写不出来,实际上只要稍微转换一下就好了. 一个前缀[1..k]是最大前缀,当且仅当前面的所有后缀[k-1,k],[k-2,k],...,[1,k]都大于0,后面的所有前缀[k+1,k+2],[k+1,k+3],...,[k+1,n]全部不大于0. 于是设f[S]表示S集合满足所有后缀大于0的排列数,g[S]表示S前缀不大于0的排列数,直接转移,最后答案就是所有集合(空集除外)的f乘上补集的g. 不卡时BZOJ时间榜与码长榜…
状态压缩 P5369 题意:求所有排列下的最大前缀和之和 一步转化: 求最大前缀和的前缀由数集S组成的方案数, 统计答案时直接乘上sum(S)即可 考虑最大前缀和的性质: 设最大前缀和为sum[i] 到i的后缀均为正数 i后的前缀均为负数 令sum[i] = 集合 i 内所有数的和. 令f[i] = 集合 i内的数组成的排列,最大前缀和 = sum[i]的方案数. 令g[i] = 集合 i内的数组成的排列,所有的最大前缀和都 < 0 的方案数. 代码: #include<iostream>…
点此看题面 大致题意: 对于一个序列,求全排列下最大前缀和之和. 状压\(DP\) 考虑如果单纯按照题目中对于最大前缀和的定义,则一个序列它的最大前缀和是不唯一的. 为了方便统计,我们姑且规定,如果一个序列中存在多个最大前缀和,我们取最靠后的一个. 由此我们想到,对于一个序列可以把它分为两部分\([1,k]\)和\([k+1,n]\)满足: \([1,k]\)是\([1,k]\)本身的最大前缀和. \([k+1,n]\)内所有前缀和均小于\(0\). 显然,由于\([1,k]\)是其本身的最大前…
题目大意:求给定的 $n$ 个数的所有排列的最大前缀和(不能为空)之和对 $10^9+7$ 取模的值. $1\le n\le 20,1\le\sum|a_i|\le 10^9$. 神级DP.杂题选讲的神级毒瘤讲题人CDW讲的. 考虑一个集合 $S$ 能作为最大前缀和出现的方案数.(即贡献系数) 发现前 $|S|$ 个数满足最大前缀和是整个序列,后 $n-|S|$ 个数满足最大前缀和 $<0$.(虽然 $\le 0$ 也行,但为了避免重复统计就要 $<0$) 设 $f[S]$ 为在 $S$ 的所…
题目链接 LOJ:https://loj.ac/problem/6433 Solution 注意到最大前缀要满足什么性质,假设序列\(a[1..n]\)的最大前缀是\(s_x\),那么显然要满足所有\(x\)结尾的后缀和都为正,且所有\(x\)开头的前缀和都为负,\(0\)的情况不影响. 有了这个转化之后就好做了,直接状压,设\(g[s]\)为选了\(s\)这些数,能构成多少种序列,使得所有前缀都为负或\(0\). 转移直接暴力枚举当前哪一个填最后一位就好了. 设\(f[s]\)表示选了\(s\…
题目链接:洛谷 题目大意:给定一个长为$n$的整数序列,求全排列的最大前缀和(必须包含第一个数)之和. 数据范围:$1\leq n\leq 20,1\leq \sum_{i=1}^n|a_i|\leq 10^9$ 神级状压dp,不得不服... 我们考虑对全排列的最大前缀和的前缀的集合进行dp. 设$f[S],g[S]$分别表示集合$S$内的数组成的排列中,最大前缀和为$sum[S]$和负数的排列数,其中$sum[S]$为$\sum_{i\in S}i$ 我们发现,如果这个最大的前缀组成的集合就是…
传送门 思路 这么一道签到题竟然没切掉真是丢人呢-- 首先有一个\(O(3^n)\)的SB方法,记录\(dp_{S,T}\)表示已经填进去了\(S\),当前最大前缀和集合为\(T\),随便转移.太简单了就不细讲了. 挖掘一下题目的性质:一个序列必然可以被分成两部分:前面的前缀和&后面的部分. 后面的部分满足一个性质:任意前缀和都<0,所以很容易DP. 前面可以考虑每次往数列前面加数,那么就必须要满足原来的数列总和\(\ge 0\),也很容易DP,具体可以见代码. 然后就做完了--我这都不会真…
分析 我们让每个数列在第一个取到最大前缀和的位置被统计到. 假设一个数列在\(pos\)处第一次取到最大前缀和,分析性质,有: 下标在\([1,pos]\)之间的数形成的数列的每个后缀和(不包括整个数列,因为要求非空)都大于\(0\). 下标在\([pos+1,n]\)之间的数形成的数列的每个前缀和(包括整个数列)都小于等于\(0\). 正确性显然. 所以我们可以把数列从\(pos\)分成两部分,分别算出各自的方案数再相乘. \([1,pos]\)部分 令\(f[S]\)表示\(S\)中的数形成…
前言 (结束再补) \(Dec\ 20th\) 正式出发 今天,是正式出发的日子. 虽说是星期五,可并没有去学校晨跑.难得睡到了\(7\)点,起来匆匆吃完了早饭(一个手抓饼),就出发去火车站了. 到了火车站,已是\(7\)点\(40\)左右.去取票的时候无意间看见了\(XZY\)神仙,然后等小叶老师来了之后便一起上了高铁. 在高铁上的时光很是漫长,也的确漫长(从上午\(8\)点多到下午\(3\)点半左右,共\(7.5\)个小时). 而我在高铁上干了些什么呢? 因为\(XZY\)神仙开了热点,所以…
[LOJ6433][PKUSC2018]最大前缀和 题面 题目描述 小 C 是一个算法竞赛爱好者,有一天小 C 遇到了一个非常难的问题:求一个序列的最大子段和. 但是小 C 并不会做这个题,于是小 C 决定把序列随机打乱,然后取序列的最大前缀和作为答案. 小 C 是一个非常有自知之明的人,他知道自己的算法完全不对,所以并不关心正确率,他只关心求出的解的期望值,现在请你帮他解决这个问题,由于答案可能非常复杂,所以你只需要输出答案乘上 \(n!\) 后对 \(998244353\) 取模的值,显然这…
原文链接https://www.cnblogs.com/zhouzhendong/p/LOJ6433.html 题解 枚举一个集合 S ,表示最大前缀和中包含的元素集为 S ,然后求出有多少个排列是这样的. 对于左边和右边分别考虑,我们可以发现: 左边:每一个后缀和都 >=0 右边:每一个前缀和都 <0 然后就只需要用两个 dp 分别求出每一个集合的元素的排列中分别满足上述条件的方案数即可. 注意一下题目要求最大前缀和非空. 代码 #include <bits/stdc++.h>…
前言 考试被\(hyj\)吊着打... Solution 考虑一下如果前缀和如果在某一个位置的后面的任意一个前缀和都<=0,肯定这就是最大的. 然后这样子就考虑左右两边的状压dp,然后就好了. 代码实现 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> #incl…
分析: 这个题非常的棒,目测如果去了能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-…
题解 神仙的状压啊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\)只要每次看看…
这题吼啊... 然而还是想了$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…
题面 题解 可以想到枚举成为最大前缀和的一部分的数 设\(sum_i=\sum\limits_{j\in i}a[j]\) 设\(f_i\)表示满足\(i\)的最大前缀和等于\(sum_i\)的方案数 转移:对于\(\forall k\notin i, sum_i > 0\) 则有 \[ f_{i\cup\{k\}} \gets f_i \] 原理:我们考虑倒着插入数字,如果存在后缀\(sum_{suf} > 0\)就可以直接转移 设\(g_i\)表示满足\(i\)的所有前缀和都\(\leq…
这是个什么集合DP啊- 想过枚举断点但是不会处理接下来的问题了- 我好菜啊 题目描述 小 C 是一个算法竞赛爱好者,有一天小 C 遇到了一个非常难的问题:求一个序列的最大子段和. 但是小 C 并不会做这个题,于是小 C 决定把序列随机打乱,然后取序列的最大前缀和作为答案. 小 C 是一个非常有自知之明的人,他知道自己的算法完全不对,所以并不关心正确率,他只关心求出的解的期望值,现在请你帮他解决这个问题,由于答案可能非常复杂,所以你只需要输出答案乘上 \(n!\) 后对 \(998244353\)…
题面 Loj 题解 先转化题意,其实这题在乘了\(n!\)以后就变成了全排列中的最大前缀和的和(有点拗口).\(n\leq20\),考虑状压\(DP\) 考虑一个最大前缀和\(\sum\limits_{i=1}^pa_i\),这个位置\(p\)是最大前缀和的右界当且仅当对于\(\forall r>p\)有:\(\sum\limits_{i=p+1}^ra_i\leq0\) 设\(sum_i\)表示二进制状态\(i\)的代数和,方便转移 设\(g_i\)表示选了子集\(i\)后有多少种排列使得所有…
题面 Loj 题解 感觉挺难的啊- 状压\(dp\) 首先,有一个性质 对于一个序列的最大前缀和\(\sum_{i=1}^{p} A[i]\) 显然对于每个\(\sum_{i=p+1}^{x}A[i](p+1 \leq x \leq n)<0\) 我们可以以\(p\)分成两个集合 \(n\leq 20\),所以状压一下 \(sum[i]\)表示当前状态表示的和 \(f[i]\)表示用当前状态的数,组成最大前缀和为\(sum[i]\)的方案数 \(g[i]\)表示当前状态的数,组成的序列,每个前缀…
传送门 今天\(PKUWC\)试机的题 看着边上的大佬们一个个\(A\)穿咱还是不会-- 我们考虑枚举最大前缀和,如果一个前缀\(1\)到\(p\)是最大前缀和,那么\(p\)后面的所有前缀和都要小于\(0\) 于是我们设\(sum_S\)为子集\(S\)中所有元素的和,\(f_S\)为满足最大前缀和为\(sum_S\)的\(S\)的排列个数,那么我们可以枚举这个排列中位于第一个的数,只要剩下的数之和\(sum_{S-\{x\}}\)大于\(0\),那么\(f_S\)就可以加上\(f_{S-\{…
上午的国庆大阅兵有意思 Description https://loj.ac/problem/6433 Solution 看数据范围认解法 首先在每种情况出现概率相同的情况下, \(期望 \times 方案数 = 权值和\),即题意就是让你求所有排列的最大前缀和的总和-- 我们可以枚举哪些数是最大前缀,显然这些数内部任意交换顺序.其它数内部任意交换顺序 都不会改变这个最大前缀. 一些数要排到前面去成为最大前缀,条件是该前缀除整段外的所有后缀和 \(\gt 0\)(因为最大前缀长度不能是 \(0\…
题目:https://loj.ac/problem/6433 想到一个方案中没有被选的后缀满足 “该后缀的任一前缀和 <=0 ”. 于是令 dp[ S ] 表示选了点集 S ,满足任一前缀和 <=0 的方案.很好转移. 令 f[ S ] 表示选了点集 S ,且 S 整体就是最大前缀和的方案. 只会 3n 做出 f[ ] ,就是考虑容斥, \( f[s]=|s|! - \sum f[d]*dp[s^d] (sm[d]>=sm[s]) \) ,其中 sm[ s ] 表示点集 s 的权值和.…
题目大意:给你一个$n(n\leqslant20)$项的数列$A$,设重排后的数列为$A'$,令$pre_p=\sum\limits_{i=1}^pA'_i$,求$max\{pre_i\}$的期望,乘$n!$ 题解:令$f_S$为选$S$集合的数,重排后满足$\max\{pre_i\}=\sum\limits_{i=1}^{|S|}S_i$的方案数,$g_S$为选$S$集合数,重排后满足$\max\{pre_i\}\leqslant0$的方案数.发现若数列$B$满足$\sum\limits_{i…