首页 > 其他分享 >P5369 [PKUSC2018] 最大前缀和 题解

P5369 [PKUSC2018] 最大前缀和 题解

时间:2023-07-26 16:27:53浏览次数:36  
标签:前缀 后缀 题解 PKUSC2018 setminus maxn P5369 sum 最大

传送门

题目大意

给定一个序列,求任意重排 \(n!\) 中情况所以的最大非空前缀和的和。模 \(998244353\)。
\(n\e 20\),\(\sum |a_i| \le 10^9\)

题目解析

考虑最大前缀和的性质,有:
对于最大前缀和部分,所有的 后缀大于等于零。(最大前缀和可能小于零)
对于不在最大前缀和的后半部分,所有的前缀和小于等于零。
证明略去,显然。
所以对于前后两部分 分开 状压 DP 即可。

先考虑后半部分。
从后往前选。设 \(g(S)\) 表示选了 \(S\) 这些数字的方案数量。
那么

\[g(S)=\sum_{i\not\in S} g(S \setminus i) \]

当然需要保证 \(\sum _{x\in S} x \ge0\)。

然后考虑前半部分。
从前向后选。
考虑到真后缀这个限制。
设 \(f(S,0/1)\) 表示选了 \(S\) 这些数字,所有后缀/所有真后缀 大于等于零的方案数。

\[f(S,0)=\sum_{i\not\in S} f(S \setminus i ,0),\sum _{x\in S} x \ge 0 \]

\[f(S,1)=\sum_{i\not\in S} f(S \setminus i ,0),\sum _{x\in S} x <0 \]

答案显然,就是

\[\sum_{S \sub U ,S\not = \varnothing} (f(S,0)+f(S,1)) g(U\setminus S) (\sum_{x\in S} x) \]

\(U\) 为全集。

时间复杂度 \(O(2^nn)\)

#define maxn 1200039
#define MOD 998244353
int n,m,a[39],p[maxn]; ll f[maxn][2],g[maxn],s[maxn];
int main(){
	fin>>n; m=(1<<n)-1; int i,j; ll ans=0;
	for(i=0;i<n;i++){ fin>>a[i],p[1<<i]=i; if(a[i]>=0) f[1<<i][0]=1; else f[1<<i][1]=1; }
	for(i=1;i<=m;i++) s[i]=s[i^(i&-i)]+a[p[i&-i]];
	g[0]=1;
	for(i=0;i<=m;i++) for(j=0;j<n;j++) if(!(i&(1<<j))){
		if(a[j]+s[i]>=0) f[i|(1<<j)][0]+=f[i][0],f[i|(1<<j)][0]%=MOD;
		else f[i|(1<<j)][1]+=f[i][0],f[i|(1<<j)][1]%=MOD,g[i|(1<<j)]+=g[i],g[i|(1<<j)]%=MOD;
	}
	for(i=1;i<=m;i++) ans+=(s[i]%MOD+MOD)%MOD*(f[i][1]+f[i][0])%MOD*g[m^i]%MOD,ans%=MOD;
	fin<<ans<<'\n'; return 0;
}

标签:前缀,后缀,题解,PKUSC2018,setminus,maxn,P5369,sum,最大
From: https://www.cnblogs.com/jiangtaizhe001/p/17582775.html

相关文章

  • [JOI 2022 Final] 自学 题解
    洛谷传送门1.题意简述:一个学期有\(N\)天\(N*M\)节课,每天的第\(i\)节课可以选择效果\(a_i\)的学习与\(b_i\)的自习。问应如何安排每节课,使所有功课最小值最大?2.思路:这道题想直接模拟非常麻烦,但是如果我们能够灵活运用二分算法,这道题就非常简单了。考虑到数据范围较......
  • luogu P9474 [yLOI2022] 长安幻世绘 详细题解
    原题:P9474[yLOI2022]长安幻世绘看到很多大佬的题解直接讲了做法,本蒟蒻看得不是很懂,调了很久才把这题做出来,于是写了这篇比较详细的题解谈一下我做这题从头到尾的思路,希望对各位有帮助qwq。思路我们首先思考这样一个问题,如果已经知道最终答案对应的最大值和最小值,又不知道题......
  • AT_agc017_b 题解
    洛谷链接&Atcoder链接本篇题解为此题较简单做法,请放心阅读。题目简述一共有\(n\)个格子,给定两个整数\(A,B\)分别位于第\(1\)和第\(n\)格,中间有\(n−2\)个空格。询问是否存在一种填数方案满足任意相邻两个数之差的绝对值在\([C,D]\)之间。依次输入\(n,a,b,c,d\)......
  • AT_arc149_a 题解
    洛谷链接&Atcoder链接本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读。题目简述求满足以下条件的小于\(10^n\)数最大是多少?每一位数字均相同;是\(m\)的倍数。数据范围:\(1\len\le10^5\),\(1\lem\le10^9\)。思路首先每位数字都相同很好满足,仅需......
  • 题解:【ICPC WF 2021 L】 Where Am I?
    题目链接这年WF较为简单的一道了,直接模拟即可。首先可以预处理出它顺时针螺旋轨迹的移动步数,方便过会算距离直接查表。我偷懒直接用map记录的距离表,这样不用处理复数下标的问题。注意到\(X\)的数量不会超过\(100\)个,所以我们可以反过来从标记点上入手。找出所有的标记点,......
  • 洛谷 P2894 [USACO08FEB] Hotel G 题解
    题目链接P2894[USACO08FEB]HotelG-洛谷|计算机科学教育新生态(luogu.com.cn)分析考虑用线段树维护区间信息维护sum(最大连续空房间数)如何合并?sum1为max(sum2,sum3)(1的两个子区间)但我们发现若区间为100001(0表示空房间)sum1=4而max(sum2,sum3)=2所以再维护suml(从左开始的......
  • 网络并发每日习题解释版
    网络并发每日习题解释版1.软件开发架构类别软件开发架构类别:软件开发架构是指在软件设计和开发过程中,用于组织和管理软件系统的基本结构。常见的软件开发架构类别包括:分层架构(LayeredArchitecture):将软件系统划分为多个相互独立的层,每个层都有特定的功能和责任。客户端......
  • 【题解】Educational Codeforces Round 150(CF1841)
    赛时过了A-E,然后就开摆了,为什么感觉C那么无厘头[发怒][发怒]排名:25thA.GamewithBoard题目描述:Alice和Bob玩游戏,他们有一块黑板。最初,有\(n\)个整数\(1\)。Alice和Bob轮流操作,Alice先手。轮到时,玩家必须在棋盘上选择几个(至少两个)相等的整数,擦除它们,然后写一个......
  • 题解 BZOJ4543【[POI2014] HOT-Hotels】
    长链剖分优化DP板子题了,但是虽然是板子这个转移方程也很难想。problem树。求\(\sum_{1\leqi<j<k\leqn}[dist(i,j)=dist(i,k)=dist(j,k)].\)。\(n\leq10^5\)。solution与重链剖分相似,长链剖分是将树剖成很多条长链。我们定义长儿子,为一个点的儿子中子树深度最大的一个儿......
  • Codeforces 1852A Ntarsis' Set 题解
    题目传送门:Codeforces1852ANtarsis'Set题意给定一个集合,里面初始有\(1,2,3...10^{1000}\),告诉你每天会拿掉其中的第\(a_1,a_2,a_3...a_n\)个,询问这样的\(k\)天之后剩下的最小的数是多少。分析思考如果\(x\)在这天没有被删掉,那么哪些被删掉的位置会对它产生什么......