1. 程式人生 > >【CODEFORCES】 C. Number of Ways

【CODEFORCES】 C. Number of Ways

C. Number of Ways time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output

You've got array a[1], a[2], ..., a[n], consisting of n integers. Count the number of ways to split all the elements of the array into three contiguous parts so that the sum of elements in each part is the same.

More formally, you need to find the number of such pairs of indices i, j (2 ≤ i ≤ j ≤ n

 - 1), that .

Input

The first line contains integer n (1 ≤ n ≤ 5·105), showing how many numbers are in the array. The second line contains n integers a[1],a[2], ..., a[n] (|a[i]| ≤  109) — the elements of array a.

Output

Print a single integer — the number of ways to split the array into three parts with the same sum.

Sample test(s) input
5
1 2 3 0 3
output
2
input
4
0 1 -1 0
output
1
input
2
4 1
output
0

題解:此題並不算難,我們設lsum[i]是從1到i所有陣列元素的和(字首和),rsum[i]是從i到n所有陣列元素的和,那麼現在就是要找到一組i,j,i<j,j-i>=2,lsum[i]=lsum[j]=sum/3。看到題目資料較大,n方演算法不划算,所以用一個c陣列記錄,c[i]表示i之後有多少個rsum[i]與sum/3相等,這樣就把時間複雜度降為O(n)了。

感覺主要是字首和...

#include <iostream>
#include <cstdio>

using namespace std;

int a[500003],c[500003],n;
long long lsum[500003],rsum[500003],sum,ans;
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        sum+=a[i];
        lsum[i]=a[i]+lsum[i-1];
    }
    if (sum%3!=0)
    {
        cout <<0<<endl;
        return 0;
    }
    for (int i=1;i<=n;i++) rsum[i]=sum-lsum[i]+a[i];
    for (int i=n;i>=1;i--) if (rsum[i]==sum/3) c[i]=c[i+1]+1;
                           else c[i]=c[i+1];
    for (int i=1;i<=n-1;i++) if (lsum[i]==sum/3) ans+=c[i+2];
    cout <<ans<<endl;
    return 0;
}


相關推薦

CODEFORCES C. Number of Ways

C. Number of Ways time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard o

CodeForces446C Number of Ways

題目分析:首先求出所有相加為2/3sum的位置,用字尾和求出從這個點開始到結尾內相加為2/3sum的點的個數suffix_sum[ i ]。最後再for一遍,每到一個1/3sum的點i,ans +

Codeforces Round #266 (Div. 2) C. Number of Ways

C. Number of Ways time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output

SPOJNUMOFPAL - Number of Palindromes(Manacher,回文樹)

spa cstring stream char define tdi () .so code 【SPOJ】NUMOFPAL - Number of Palindromes(Manacher,回文樹) 題面 洛谷 求一個串中包含幾個回文串 題解 Manacher傻逼題 只是用

C. Number of Ways 思維

sdi print arr 技術 read space play \n src 題目大意就是問能分出幾個使三個區間的和相等的分發 1 #include <algorithm> 2 #include <stack> 3 #include

leetcode726. Number of Atoms

app false sel lis 分享圖片 bject bre src enume 題目如下: 解題思路:我用的是遞歸的方法,每次找出與第一個‘)‘匹配的‘(‘計算atom的數量後去除括號,只到分子式中沒有括號為止。例如 "K4(ON(SO3)2)2" -> "K

ManacherSP7586NUMOFPAL - Number of Palindromes

for output std 一位 lin string lse 添加 cstring Description 求一個串中包含幾個回文串。 Input 輸入一個字符串\(S\) Output 包含的回文串的個數. 看到題解裏面有人人寫回文自動機. 有必要那麽麻煩嘛 em

LeetCode933. Number of Recent Calls 解題報告(Python)

作者: 負雪明燭 id: fuxuemingzhu 個人部落格: http://fuxuemingzhu.cn/ 目錄 題目描述 題目大意 解題方法 二分查詢 佇列 相似題目

LeetCode726. Number of Atoms 解題報告(Python)

題目描述: Given a chemical formula (given as a string), return the count of each atom. An atomic element always starts with an upper

Codeforces 466CNumber of Ways

滿足 def int ber i+1 edr lose close tokenize 【鏈接】 我是鏈接,點我呀:) 【題意】 讓你把數組分成3個連續的部分 每個部分的和要一樣 問你有多少種分法 【題解】 先處理出來num[i] 表示i..n這裏面有多少個j

codeforces 718 C&DC. Sasha and Array&D. Andrew and Chemistry

pre sig signed 時間復雜度 struct 得到 ast 16px etc             C. Sasha and Array 題目大意&題目鏈接:   http://codeforces.com/problemset/problem/71

CodeForces578 C. Weakness and Poorness

const 現在 else log display closed string force bit 【題目】C. Weakness and Poorness 【題意】給定含n個整數的序列ai,定義新序列為ai-x,要使新序列的最大子段和絕對值最小,求實數x。n<=2*

CodeForces901 C. Bipartite Segments

無向連通圖 tarjan 容易 相交 play ace 偶數 segments memset 【題目】C. Bipartite Segments 【題意】給定n個點m條邊的無向連通圖,保證不存在偶數長度的簡單環。每次詢問區間[l,r]中包含多少子區間[x,y]滿足只保留[x

CodeforcesCF 467 C George and Job(dp)

++ clas show mes ces -m col scanf tro 題目 傳送門:QWQ 分析 dp基礎題。 $ dp[i][j] $表示前i個數分成j組的最大和。 轉移顯然。 吐槽:做cf題全靠洛谷翻譯茍活。 代碼 1

CodeforcesCF 5 C Longest Regular Bracket Sequence(dp)

ont ref urn 左右 namespace 連續 %d pan tro 題目 傳送門:QWQ 分析 洛谷題解裏有一位大佬講的很好。 就是先用棧預處理出可以匹配的左右括號在數組中設為1 其他為0 最後求一下最長連續1的數量。 代碼

CodeforcesCF 8 C Looking for Order(狀壓dp)

輸出 max blank ret ces clas pan force date 題目 傳送門:QWQ 分析 這種題不會做 吃棗藥丸。。。。。 想到狀壓已經經過的點。 然後更新時枚舉兩個點加進去。 復雜度$ {O(2^n \times n^2)

CodeForces426Div2 C The Meaningless Game

連結:http://codeforces.com/contest/834/problem/C Solution 考的時候想複雜了,沒從整體下手。 因為一邊乘了k一邊乘了k^2,所以乘起來一定是k^3 記 c=(a∗b)13 c=(a*b)^\frac{1}

codeforcesRound #522 (Div. 2) A+B+C+D

目錄 【A. Kitchen Utensils】 【B. Personalized Cup】 【C. Playing Piano】 【D. Barcelonian Distance】  【A. Kitchen Utensils】 題目連結:htt

codeforcesRound #520 (Div. 2) A+B+C+D

目錄 A - A Prank B - Math C - Banh-mi D - Fun with Integers 【A - A Prank】 題目連結:http://codeforces.com/contest/1062/problem/A 【題意】 給你一串序