首页 > 其他分享 >洛谷 P5369

洛谷 P5369

时间:2022-11-01 11:01:08浏览次数:61  
标签:ge0 洛谷 前缀 int sum lt P5369 mod

先规定一些东西:

若存在多个 \(p\) 使得 \(\sum_{i=1}^{p}{a_i}\) 最大,默认最大(即最靠右)的一个 \(p\) 是它的最大前缀和的位置。

\(U\) 表示全集。


假设 \(p\) 是最大前缀和的位置,则说明不存在 \(1\lt x\le p\) 满足 \(\sum_{i=x}^{p}a_i\lt 0\),否则去掉这段答案不会变小。并且不存在 \(p\lt x\le n\) 满足 \(\sum_{i=p+1}^{x}a_i\ge0\),否则我们把这一段加上之后不会更劣。

而且数据范围那么小就考虑状压。

令 \(sum_i\) 表示集合 \(i\) 内所有数的和,\(f_i\) 表示集合 \(i\) 内的数组成的排列,最大前缀和 \(=sum_i\) 的方案数,\(g_i\) 表示集合 \(i\) 内的数组成的排列,所有的最大前缀和都 \(\lt0\) 的方案数。

显然最终答案为 \(\sum_i sum_i\times f_i\times g_{U-i}\)

先考虑如何求出 \(g_i\)。

当 \(sum_i\ge0\) 时,\(g_i=0\)。否则 \(g_i=\sum\limits_{j\in i}g_{i-j}\)。

然后 \(f_i\) 的话考虑刷表,在集合 \(i\) 的排列前加入一个数 \(j\)(\(j\notin i\))。

如果 \(sum_i\ge0\),那么 \(f_{i+j}+=f_i\),否则 \(f_i\) 没有贡献。

时间复杂度 \(\mathcal O(n2^n)\)。

Code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 20, M = 1 << N, mod = 998244353;
int n, m;
int a[N];
ll sum[M]; int f[M], g[M];

void add(int &a, int b) {
	a += b;
	if (a >= mod) a -= mod;
	if (a < 0) a += mod;
}

int main() {
	scanf("%d", &n), m = 1 << n;
	for (int i = 0; i < n; ++i) scanf("%d", &a[i]), sum[1 << i] = a[i], f[1 << i] = 1;
	for (int i = 1; i < m; ++i) sum[i] = sum[i ^ (i & -i)] + sum[i & -i];
	g[0] = 1;
	for (int i = 1; i < m; ++i) {
		if (sum[i] >= 0) {
			for (int j = 0; j < n; ++j) if (!(i >> j & 1)) add(f[i | (1 << j)], f[i]);
		}
		else {
			for (int j = 0; j < n; ++j) if (i >> j & 1) add(g[i], g[i ^ (1 << j)]);
		}
	}
	int ans = 0;
	for (int i = 1; i < m; ++i) add(ans, sum[i] * f[i] % mod * g[(m - 1) ^ i] % mod);
	printf("%d", ans);
	return 0;
}

标签:ge0,洛谷,前缀,int,sum,lt,P5369,mod
From: https://www.cnblogs.com/Kobe303/p/16846983.html

相关文章

  • 洛谷 P1464 Function(dfs+记忆化搜索)
    https://www.luogu.com.cn/problem/P1464单个返回条件的时候,直接return多个返回条件的时候,采用记忆化搜索思想,边存储边继续往下搜索中间穿插记忆化判断,如果之前有过此......
  • 【洛谷P7816 】【Stoi2032】以父之名
    在洛谷题解中看到了两种做法。法一:与zjr巨佬说的类似,我们先能观察出这个图的几个性质:若只保留边权为\(1\)的边,那么所有点的度数都是奇数。那么也可以得到\(n\)为偶......
  • 洛谷 P1153 点和线
    前置知识(1)求两条线段的交点方法1,运用高中的解析几何知识求.方法2,运用向量点积求.考虑向量叉乘。若\(\veca\times\vecb>0\),那么\(\vecb\)在\(\veca\)......
  • 洛谷 P1789【Mc生存】插火把
    萌新写的代码,长但模块化#include<stdio.h>#defineROW100#defineCOLUMN100intmap[ROW][COLUMN];/*函数测试数据={1,1,1,0,0,1,1,0,1,0,1,1,1,0,0,0,0,0,0,0......
  • 洛谷P8539 「Wdoi-2」来自地上的支援 题解
    ST表做法思路当进行第\(x\)次操作时,若\(b_1\)到\(b_{x-1}\)中有比\(b_x\)大的数,那这次操作轮不到\(b_x\),并且前面的本来就比它大的数只会越来越大,所以以后的......
  • P1597洛谷刷题
    #include<iostream>#include<string>usingnamespacestd;intmain(intargc,char**argv){ stringstr="a:=3;b:=4;c:=5"; for(inti=1;i<=3;i++){ ints......
  • 洛谷P5759题解
    本文摘自本人洛谷博客,原文章地址:https://www.luogu.com.cn/blog/cjtb666anran/solution-p5759\[这道题重在理解题意\]选手编号依次为:\(1,2...N\)(\(N\)为参赛总人数)。......
  • 【EA的练习赛2】【洛谷P7274】草地(单调栈,LCT维护最小生成树)
    学到了很多。我们分步走。首先在做这道题前先观察到几个小性质:操作顺序不同不影响结果发现对于每一个黑点,一通操作过后它扩展出的区域是一个矩形,而操作顺序是不影响......
  • 洛谷P3391 【模板】文艺平衡树
    题目描述您需要写一种数据结构(可参考题目标题),来维护一个有序数列。其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4] 的话,结果是5 2 ......
  • 洛谷P8805题解
    原题P8805[蓝桥杯2022国B]机房思路概述题意分析给定一个\(n\)个点的无根树,每个点的权值等于其出边数量。对于给定的\(m\)组询问,第\(i(1≤i≤n)\)组询问包......