当前位置: 首页 > news >正文

AcWing 3956. 截断数组(每日一题)

AcWing 3956. 截断数组

题目描述

给定一个长度为 nnn 的数组 a1,a2,…,ana_1, a_2, …, a_na1,a2,,an

现在,要将该数组从中间截断,得到三个非空子数组。

要求,三个子数组内各元素之和都相等。

请问,共有多少种不同的截断方法?

输入格式

第一行包含整数 nnn

第二行包含 nnn 个整数 a1,a2,…,ana_1, a_2, …, a_na1,a2,,an

输出格式

输出一个整数,表示截断方法数量。

数据范围

前六个测试点满足 1≤n≤101≤n≤101n10
所有测试点满足 1≤n≤1051≤n≤10^51n105−10000≤ai≤10000−10000≤a_i≤1000010000ai10000

输入样例1:

4
1 2 3 3

输出样例1:

1

输入样例2:

5
1 2 3 4 5

输出样例2:

0

输入样例3:

2
0 0

输出样例3:

0

思路

先预处理前缀和,先判断如果s[n] % 3 != 0 ,则不能被均分为三份,输出 0.

然后从 i = 3 开始枚举前缀和数组,以 iii 作为切割点,s[i - 2] 为第一段,s[n] - s[i - 1] 为第三段,如果 第一段 = 第三段 = s[n]/3s[n] / 3s[n]/3,则第二段也一定相等,都符合条件。

先判断第一段是否符合,记录个数,如果第三段不符合,则表示该切割点不行,继续后移,每次当第三段符合时,都加上第一段符合的个数即可。

代码

#include <iostream>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
const int N = 1e5 + 10;int n;
ll s[N];int main()
{cin >> n;for (int i = 1; i <= n; i++){cin >> s[i];s[i] += s[i - 1];}if (s[n] % 3){cout << 0 << endl;return 0;}ll cnt = 0, res = 0;for (int i = 3; i <= n; i++){if (s[i - 2] == s[n] / 3) cnt++;if (s[n] - s[i - 1] == s[n] / 3) res += cnt;}cout << res << endl;return 0;
}

http://www.lryc.cn/news/5401.html

相关文章:

  • Android 一体机研发之修改系统设置————屏幕亮度
  • C++通用算法
  • Springboot停机方式
  • Linux perf_event_open 简介
  • Java给定两组起止日期,求交集
  • 数组的复制与二维数组的用法
  • JS判断两个table数据是否完全相等(判断两个数组对象是否完全相等)
  • 关于小程序,你想知道的这些
  • WuThreat身份安全云-TVD每日漏洞情报-2023-02-13
  • 【Linux】软件安装(三分钟教会你如何在linux下安装软件)
  • Fluent Python 笔记 第 10 章 序列的修改、散列和切片
  • 在中国程序员工作是青春饭吗?
  • Linux tcpdump
  • redis知识汇总(部署、高可用、集群)
  • 【手写 Vuex 源码】第十篇 - Vuex 命名空间的实现
  • 面试腾讯测试岗后感想,真的很后悔这5年一直都干的是基础测试....
  • 知识图谱 方法、实践与应用 王昊奋 读书笔记(下)
  • vue实现打印浏览器页面功能(两种方法)
  • 【VictoriaMetrics】VictoriaMetrics单机版批量和单条数据写入(Prometheus格式)
  • 【青训营】分布式定时任务简述
  • golang语言本身设计点总结
  • PTA L1-046 整除光棍(详解)
  • 将小程序代码转成uni-app代码
  • C语言在游戏中播放音乐
  • 机器学习算法:随机森林
  • 如何做好多项目全生命周期的资源调配,提升资源利用效率?【橙子】
  • JVM - 内存分配
  • 【知识图谱论文】Bi-Link:通过转换器和提示的对比学习桥接来自文本的归纳链接预测
  • jieba+wordcloud 词云分析 202302 QCon 议题 TOP 关键词
  • 包管理工具-npm-npx-yarn-cnpm