首页 > 其他分享 >AcWing 3956. 截断数组 [前缀和]

AcWing 3956. 截断数组 [前缀和]

时间:2023-02-20 11:56:01浏览次数:59  
标签:前缀 int 3956 1e5 数组 第二刀 AcWing

AcWing 3956. 截断数组 [前缀和]

原题链接

讲解视频

思路

题意是将一串数字从中间切两刀分成三段。每一段的和都相等。

要求这三段每一段的和都相等,那么总和肯定是3的倍数,否则就无解。
求解时,可以枚举第一刀/第二刀 + 前缀和来求解。

题目数组长度是1e5,可能是需要\(O(n)\)或\(O(nlogn)\)来解决,暴力\(O(n^2)\)显然不行。

答案可能爆int:前缀和数组不会爆int,但是答案可能爆int,比如1e5个0答案是1e10会爆int

画图可知,前缀和处理后,s[n]必然是3的倍数,否则无解

求解具体做法是枚举第二刀。
用一个变量维护第一刀切点前缀和是s/3的方案数,当第二刀合法的时候直接加上在这之前的第一刀的方案数即可。这样时间复杂度是O(n)

代码

#include<iostream>

using namespace std;

const int N = 1e5 + 10;
typedef long long LL;

int s[N];
LL res;

int main()
{
    int n;
    cin >> n;
    for(int i = 1;i <= n;i ++) cin >> s[i];
    for(int i = 1;i <= n;i ++) s[i] = s[i-1] + s[i];
    
    if(s[n] % 3)  puts("0");
    else
    {
        LL cnt = 0;
        for(int i = 3;i <= n;i ++)
        {
            if(s[i-2] == s[n]/3) cnt ++; // 用cnt变量记录第一个点前缀和是s/3有多少种方案
            if(s[n] - s[i-1] == s[n]/3) res += cnt; // 如果第二刀在i这里能切,就加上在这之前第一刀的方案数
        }
        
        cout << res;
    }
    
    
    return 0;
}

标签:前缀,int,3956,1e5,数组,第二刀,AcWing
From: https://www.cnblogs.com/rdisheng/p/17136681.html

相关文章

  • 「AcWing学习记录」Dijkstra
    AcWing849.Dijkstra求最短路I原题链接朴素Dijkstra1.dis[1]=0,dis[i]=\(+\infty\)2.for(inti=0;i<n;i++)s:当前已确定最短距离的点t\(\leftarrow\)......
  • AcWing 372. 棋盘覆盖
    给n*n的方格图铺满1*2的长条,且某些位置不能铺,问最多能放多少个长条 #include<iostream>#include<queue>#include<vector>#include<cstring>usingnamespaces......
  • acwing 数组元素的目标和
    原题链接题解代码双指针#include"iostream"usingnamespacestd;constintN=100010;inta[N],b[N];intmain(){intn,m,x;cin>>n>>m>>x;for(i......
  • acwing 判断子序列
    原题链接题解分析使用双指针,o为数组1的指针,p为数组2的指针因为数组2要比数组1大,所以使p每次循环自增,当有相同值,使o自增,最后检查o是否已经遍历完毕即可代码#includ......
  • 【算法】数组的前缀和 Prefix Sum
    算法中有前缀和这样一种很好的数据结构,它能极大地降低区间查询的时间复杂度前缀和-PrefixSum 它是这样的,假如有这样一个数组(序列), A=[a1,a2,a3,a4,a5,a6,......
  • ACwing 区间最大公约数题解 线段树(附证明)
    算进区间最大公因数单点线段树 https://www.acwing.com/problem/content/247/题目:给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一:Clrd,表......
  • AcWing95. 费解的开关(/思维题)
    原题原题解题目约束题解#include<iostream>#include<cstring>usingnamespacestd;constintN=11;charg[N][N];intdx[]={0,-1,0,1,0},dy[]={0......
  • AcWing788.逆序对的数量(Java)
    题目来源:https://www.acwing.com/problem/content/790/题目描述给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第i个和第j......
  • AcWing 每日一题 未初始化警告
    #include<bits/stdc++.h>usingnamespacestd;signedmain(){intn,k,cnt=0;cin>>n>>k;set<int>se;se.insert(0);while(k--){in......
  • AcWing 787.归并排序(Java)
    题目来源:https://www.acwing.com/problem/content/description/789/题目描述给定你一个长度为n的整数数列。请你使用归并排序对这个数列按照从小到大进行排序。并将......