ABC370 E - Avoid K Partition

求一个序列的合法划分方案数。一种划分合法当且仅当没有一个子串的和是 \(k\)。

由于是否存在子串和为 \(k\) 很重要,因此考虑将它加入状态设计中,记 \(f[i][0/1]\) 表示 \(1 \sim i\),\(i\) 处结束,还没有 / 已有和为 \(k\) 的子段,方案数。

用 \(s[i]\) 表示前缀和,得到朴素的 \(O(n^2)\) 转移:

\[f[i][0] = \sum_{0 \le j \lt i \cap s[i] - s[j] \ne k} f[j][0]
\]
\[f[i][1] = \sum_{0 \le j \lt i}f[j][1] + \sum_{0 \le j \lt i \cap s[i] - s[j] = k} f[j][0]
\]

发现 \(a[i], k\) 可以是负数,因此 \(s\) 没有单调性,不好直接找每个 \(i\) 对应的 \(j\),可能也不止一个。但对于固定的 \(i\),\(s[j] = s[i] - k\) 是固定的,因此我们可以对于每个 \(s[j]\) 都实时维护 \(\sum{f[j][0]}\),值域较大,用 \(map\) 实现就 ok。最后对 \(f[][0/1]\) 分别记录前缀和就可以做到 \(O(nlogn)\)。转移没什么变化,直接看代码,最后记得取模变正数。

#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l);i<=(r);++i)
#define G(i,r,l) for(int i(r);i>=(l);--i)
#define int ll
using namespace std;
using ll = long long;
const int N = 2e5 + 5;
const int mod = 998244353;
int f[N][2], s[N];
int n, k, a[N];
map<int, int> mp;
signed main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> k;
F(i, 1, n) {
cin >> a[i];
s[i] = s[i - 1] + a[i];
}
int sm0 = 1, sm1 = 0;
mp[0] = 1;
F(i, 1, n){
int ret = mp[s[i] - k];
f[i][0] = (sm0 - ret) % mod;
f[i][1] = (sm1 + ret) % mod;
(mp[s[i]] += f[i][0]) %= mod;
(sm0 += f[i][0]) %= mod;
(sm1 += f[i][1]) %= mod;
}
cout << (f[n][0] + mod) % mod << '\n';
return fflush(0), 0;
}

ABC370 E - Avoid K Partition的更多相关文章

  1. Lintcode: Partition Array

    Given an array "nums" of integers and an int "k", Partition the array (i.e move ...

  2. Partition Array

    Given an array nums of integers and an int k, partition the array (i.e move the elements in "nu ...

  3. 【Offer】[40] 【最小的K个数】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入n个整数,找出其中最小的k个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 牛客网刷题地 ...

  4. 线性时间求取第 K 大数

    求 Top K 的算法主要有基于快速排序的和基于堆的这两种,它们的时间复杂度都为 \(O(nlogK)\).借助于分治思想,以及快速排序的区间划分,我们可以做到 \(O(n)\) 时间复杂度.具体算法 ...

  5. 用Java来写常见的排序算法

    随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * ...

  6. Python字符串str的方法使用

    #!usr/bin/env python# -*-coding:utf-8-*-#字符串通常用双引号或单引号来表示:'123',"abc","字符串"#str字 ...

  7. List.Sort以及快速排序ZZ

    经常看到有人因为使用.net中的集合类处理海量数据时性能不够理想,就武断的得出.net不行,c#也不行这样的结论.对于.net framework这样的类库来说,除了性能以外,通用性和安全性同样重要, ...

  8. Java中各种排序算法

    package org.rut.util.algorithm.support; import org.rut.util.algorithm.SortUtil; /** * @author treero ...

  9. c语言:快速排序

    练手代码(分治实现): input: int input[] = {12,6,3,9,10,6,2}; output: ======================= len = 7 input[0] ...

  10. 排序算法总结(C++版)

    总结下学过的排序算法,方便以后用到. 1.插入排序——将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表. void insertSort(int a[],int len) { ; ...

随机推荐

  1. Docker 容器中镜像导出/导入

    目录 [容器]镜像导出/导入 导出 导入 带标签 不带标签,后期修改 [仓库]镜像导出/导入 导出 导入 导入(完整命令) 创建一个简单的Docker镜像 利用docker ps -a命令查看要导出的 ...

  2. 【2】Kaggle 医学影像数据读取

    赛题名称:RSNA 2024 Lumbar Spine Degenerative Classification 中文:腰椎退行性病变分类 kaggle官网赛题链接:https://www.kaggle ...

  3. JavaScript设计模式样例十二 —— 享元模式

    享元模式(Flyweight Pattern) 定义:减少创建对象的数量,以减少内存占用和提高性能.目的:用共享技术有效地支持大量细粒度的对象.场景:系统中有大量对象. // 构建享元对象 class ...

  4. Windows下cmd中cd命令不起作用的原因和解决办法

    Windows下cmd中cd命令不起作用的原因和解决办法 如图:cd命令无效 原因:windows系统cmd换目录跨磁盘的话需要先进行磁盘的转换

  5. 【转】如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容?

    文章名称: 如何在ASP.NET Core自定义中间件读取Request.Body和Response.Body的内容?作者: Lamond Lu地址: https://www.cnblogs.com/ ...

  6. 【YashanDB知识库】v$instance视图中实例角色含义不明确

    [标题]v$instance视图中实例角色含义不明确 [问题分类]文档问题 [关键词]YashanDB, v$instance, 实例角色 [问题描述]v$instance视图中实例角色(如MASTE ...

  7. 全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类

    全网最适合入门的面向对象编程教程:50 Python 函数方法与接口-接口和抽象基类 摘要: 在 Python 中,接口和抽象基类(Abstract Base Classes, ABCs)都用于定义类 ...

  8. Laravel视图共享数据

    Laravel视图共享数据 最近在用lavavel过程中想实现公共头部尾部需要的配置数据在所有的页面中都可以使用,便查看了官方文档,在此做一个总结: 一. 修改 ComposerServiceProv ...

  9. 对3D图像进行裁剪

    在对医学图像进行深度学习的过程中,我们会遇到图片过大,导致train的过程中网络会瘫痪,所以我们会考虑到对图像进行分割.比如一张155x240x240的图像,我们可以将他分割成一系列128x128x1 ...

  10. 使用VNC连接ubuntu16.4错误Authentication Failure问题

    解决办法:是因为vnc用一套自己的密码系统,不要去输入ssh登录时的密码,所以只需要进入远程服务器中,设置一哈vnc的密码即可! 在终端输入命令:vncpasswd 到此可以试试远程