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

P5369 [PKUSC2018]最大前缀和

时间:2022-11-25 19:48:10浏览次数:55  
标签:前缀 sum ge bigoplus P5369 PKUSC2018

P5369 [PKUSC2018]最大前缀和

题目要我们求每一种排列的最大前缀和,不妨考虑先确定最大前缀和,再计算它的方案数,设\(U\)为全集,那么答案就为\(\sum_{S \subseteq U}sum[S] * f[S]\),其中\(sum[S] = \sum_{i \in S}a_i\),那么我只需要考虑怎么去求\(f[S]\)。
设最最大前缀和为位置为\(1\)到\(x\)的和,那么对于任意\(1<i\le x\),\(\sum_{j = i}^xa_j \ge 0\),对于任意\(x<i\le n\),\(\sum_{j = x + 1}^ia_i<0\)。
这两个限制是独立的,可以分开\(DP\),设\(h_{S,0/1}\)表示前缀点集是\(S\),\(0\)表示\(sum[S] < 0\),\(1\)表示\(sum[S]\ge 0\)的方案数。那么考虑从后向前加数,注意我们不需要保证\(sum[S] \ge 0\)。
所以转移为

\[h_{S,0} += h_{S \bigoplus u,1}(sum[S] < 0) \]

\[h_{S,1} += h_{S \bigoplus u,1}(sum[S] \ge 0) \]

设\(g_{S}\)表示后缀点集为\(S\)的方案数,那么转移为

\[g_{S} += g_{S \bigoplus u}(sum[S] < 0) \]

所以\(f[S] = (h_{S,0}+h_{S,1})*g_{S}\)

Code
#include<cstdio>
#include<iostream>
#define IN inline
#define LL long long
using namespace std;
const int N = 1 << 21, P = 998244353;
int n; LL a[25], sum[N], f[N][2], g[N];

IN int read() {
	int t = 0,res = 0; char ch = getchar();
	for (; !isdigit(ch); ch = getchar()) t |= (ch == '-');
	for (; isdigit(ch); ch = getchar()) res = (res << 3) + (res << 1) + (ch ^ 48);
	return t ? -res : res;
}
int main() {
	n = read();
	for (int i = 1; i <= n; i++) a[i] = read();
	for (int i = 1; i < (1 << n); i++)
		for (int j = 1; j <= n; j++)
			if ((i >> j - 1) & 1) sum[i] += a[j];
	f[0][1] = g[0] = 1;
	for (int i = 1; i < (1 << n); i++)
		for (int j = 1; j <= n; j++)
			if ((i >> j - 1) & 1)
				if (sum[i] < 0) (f[i][0] += f[i ^ (1 << j - 1)][1]) %= P, (g[i] += g[i ^ (1 << j - 1)]) %= P;
				else (f[i][1] += f[i ^ (1 << j - 1)][1]) %= P;
	LL ans = 0;
	for (int i = 1; i < (1 << n); i++)
		(ans += (sum[i] + P) * (f[i][0] + f[i][1]) % P * g[((1 << n) - 1) ^ i] % P) %= P;
	printf("%lld\n", ans);
}

标签:前缀,sum,ge,bigoplus,P5369,PKUSC2018
From: https://www.cnblogs.com/nibabadeboke/p/16926172.html

相关文章

  • [NEFU ACM大一暑假集训 解题报告]前缀和与差分
    [NEFUACM大一暑假集训解题报告]前缀和与差分题量略大,所以解题报告和fjy大佬分了一下工由我负责A-K部分题解(不是AK部分题解啊,哈哈)后半部分题解(LM+R~V+XYZ)由fjy大佬发布......
  • 212. 单词搜索 II(字典树/前缀树)
    给定一个 mxn 二维字符网格 board 和一个单词(字符串)列表 words, 返回所有二维网格上的单词 。单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻......
  • 2022NOIP A层联测33 GCD 简单题 建筑 树上前缀和
    T1:[图论/枚举]给出有边权无向图,边权保证互不相同,Q次询问从S到T的路径中,边权的gcd最大是多少。(n<=1e4,Q<=2e5,w<=1e6)考场根据之前的一道图论题经验,在最短路上加个“\(w......
  • TM4C123G学习记录(4)--关于ROM前缀函数和HWREG函数
    为了准备电赛临时学一下TM4C123G,简单记录学习内容大家可以在​​这里​​下载我收集的资源,非常全面,花了很大功夫收集来的,还有书籍、例程代码等还可以在TI官网下载相关文档​......
  • 牛客小白月赛61 F 尺取法 前缀和
    题目的描述是多维的即有人数限制又有座位限制。但是每次选座位是连续的,这意味着可以利用尺取法贪心的求出以每个左端点为起始最小的合法的右端点。考虑如何求f(x)即x人......
  • leetcode_Day1_14最长公共前缀
    1.题目  2.解一  主要思路:横向比较,字符串数组的公共前缀等于前两个字符串的公共前缀与第三个字符串比较,再与第四个比较。即依次遍历字符串数组中的每个字符串,对......
  • 1732. 找到最高海拔 ----- 简单模拟、差分数组前缀和
    有一个自行车手打算进行一场公路骑行,这条路线总共由 n+1 个不同海拔的点组成。自行车手从海拔为0 的点 0 开始骑行。给你一个长度为n 的整数数组 gain ,其中g......
  • 前缀和
    目录简介应用应用1:Leetcode.303题目分析代码实现应用2:Leetcode.523题目分析代码实现简介求区间和,一般的思路都是利用前缀和的思想。应用应用1:Leetcode.303题目303.区......
  • MySQL 索引最左前缀原则失效?
    测试索引最左前缀原则,发现缺失带头索引后,索引还是生效的。一、测试创建测试表CREATETABLE`user`(`id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'主键',......
  • Counting Rectangles(二维数组前缀和)
    题目链接题目描述:Youhave\(n\)rectangles,the\(i\)-threctanglehasheight\(h_i\)andwidth\(w_i\).Youareasked\(q\)queriesoftheform\(h_sw_sh_b......