首页 > 其他分享 >[ARC187B] Sum of CC 题解

[ARC187B] Sum of CC 题解

时间:2024-11-18 10:30:55浏览次数:1  
标签:联通 前缀 CC 题解 Sum long int MAXN

若 \(i\) 与 \(j\) 有边,也就是 \(a_i<a_j\),那么对于一个 \(i < k < j\),会发现 \(a_k>a_i\) 和 \(a_k<a_j\) 至少满足一个。也就是说 \(k\) 也一定和 \(i,j\) 联通。于是我们发现了一个关键性质:所有联通块都为一个区间。

那我们考虑 \(i\) 和 \(i+1\) 什么时候不联通:\(i\) 之前的任意一个数都大于 \(i\) 之后的任意一个数。也就是前缀 \(\min\) 大于后缀 \(\max\) 的时候。

那就可以先用 dp 预处理出前 \(i\) 个数的前缀 \(\min\) 为 \(j\) 的方案数,后缀同理。因为联通块数其实就是有多少个 \(i\) 和 \(i+1\) 不联通,所以直接枚举 \(i\) 然后用 dp 值统计答案即可。需要前缀和优化。

//dzzfjldyqqwsxdhrdhcyxll
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 2e3 + 10;
const int mod = 998244353;
int n,m,a[MAXN],f[MAXN][MAXN],sum[MAXN][MAXN],ans,g[MAXN][MAXN];
signed main() {
	cin >> n >> m;
	for(int i = 1;i <= n;i++) cin >> a[i];
	f[0][m] = 1,sum[0][0] = f[0][0];
	for(int i = 1;i <= m;i++) 
		sum[0][i] = (sum[0][i - 1] + f[0][i]) % mod;
	for(int i = 1;i <= n;i++) {
		for(int j = 1;j <= (a[i] == -1 ? m : a[i]);j++) {
			f[i][j] = f[i - 1][j] * (a[i] == -1 ? (m - j + 1) : 1) % mod;
			if(j == a[i] || a[i] == -1) f[i][j] = (f[i][j] + sum[i - 1][m] - sum[i - 1][j] + mod) % mod;
		}
		for(int j = 1;j <= m;j++) sum[i][j] = (sum[i][j - 1] + f[i][j]) % mod;
	}
	memset(sum,0,sizeof sum);
	g[n + 1][0] = 1,sum[n + 1][0] = g[n + 1][0];
	for(int i = 1;i <= m;i++) 
		sum[n + 1][i] = (sum[n + 1][i - 1] + g[n + 1][i]) % mod;
	for(int i = n;i >= 1;i--) {
		for(int j = (a[i] == -1 ? 1 : a[i]);j <= m;j++) {
			g[i][j] = g[i + 1][j] * (a[i] == -1 ? j : 1) % mod;
			if(j == a[i] || a[i] == -1) g[i][j] = (g[i][j] + sum[i + 1][j - 1]) % mod;
		}
		for(int j = 1;j <= m;j++) sum[i][j] = (sum[i][j - 1] + g[i][j]) % mod;
	}
	for(int i = 1;i <= n;i++) 
		for(int j = 1;j <= m;j++) 
			ans = (ans + f[i][j] * sum[i + 1][j - 1]) % mod;
	cout << ans;
	return 0;
}

标签:联通,前缀,CC,题解,Sum,long,int,MAXN
From: https://www.cnblogs.com/Creeperl/p/18551960

相关文章

  • MoD:轻量化、高效、强大的新型卷积结构 | ACCV'24
    来源:晓飞的算法工程笔记公众号,转载请注明出处论文:CNNMixture-of-Depths论文地址:https://arxiv.org/abs/2409.17016创新点提出新的卷积轻量化结构MoD,在卷积块(Conv-Blocks)内通过动态选择特征图中的关键通道进行集中处理,提高效率。CNNMoD保留了静态计算图,这提高了训......
  • HarmonyOS Next 椭圆曲线密码学应用:ECC 与 SM2 深入剖析
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、引言在现代密码学领域,椭圆曲线密......
  • AtCoder Beginner Contest 380 (A~E)题解
    A-123233遍历字符串统计出现次数即可。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e6+10;intn,m,k;inta[N];signedmain(){ strings; cin>>s; map<char,int>mp; for(autot:s){ mp[t]++; } if(......
  • P10124 [USACO18OPEN] Family Tree B 题解
    思路这道题目很像找\(2\)头牛的最近公共祖先,即lca,但是并不用那么麻烦.因为数据很小,我们可以写一个山寨版的lca.具体如下.intmother(stringx,stringy){ intres=0; while(y!=""){//有名字的牛 if(x==y)returnres;//两头牛的名字相等,说明是同......
  • [AGC032B] Balanced Neighbors 题解
    考虑先写个暴力\(O(n2^m)\)的输出一下结果,看一下n=4,5,6的(尤其是n=6的)结果,尤其是每个点像其余哪几个点连边,然后就想到了构造方案。代码constintN=109;intn;inte[N][N];voidskymaths(){read(n);if(n%2==0){rep(i,1,n){......
  • WINCC 7.5SP2下VBA创建变量组、变量1
    今晚继续学习Wincc下面使用VBA创建变量分组,分组下创建多个变量。新浪审核有点慢,我在这里先发表了。在变量管理中新建一个S7连接,配置好连接参数,这个不能通过VBA创建。 打开wincc页面,在VBA编辑器下写下面的脚本: Subaddtags()DimhmigoAshmigoDimstrTagGroupAsStringD......
  • 一些Leetcode关于双指针的简单题解
    26.删除有序数组中的重复项给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保......
  • [题解]AtCoder Beginner Contest 380(ABC380) A~F
    A-123233照题意统计即可。点击查看代码#include<bits/stdc++.h>usingnamespacestd;strings;map<char,int>ma;signedmain(){ cin>>s; for(chari:s)ma[i]++; if(ma['1']==1&&ma['2']==2&&ma['3']==3)co......
  • neovim 配置 LSP(ccls)
    本文主要介绍如何在nvim中配置使用ccls。安装与配置首先安装LSP管理插件:...--省略其他行require("lazy").setup({ --LSPmanager "williamboman/mason.nvim", "williamboman/mason-lspconfig.nvim", "neovim/nvim-lspconfig",...--省略其他行})其......
  • 【星航计划】2024.11 Div. 3 题解
    2024--星航计划--十一月份--基础算法A.分段每一段连续的\(1\)之间是独立的,我们只需要关心一段连续的1的结果。可以证明对于一段连续的\(1\),最优策略是将其划分成多个单独的\(1\)以及可能余下的连续两个\(1\)。对于\(k\)个连续的\(1\),如果\(k\)是奇数,......