フェンウィック木+差分、その後、$ A $ A $ OVO $:私は元のタイトルを行っていない、とし、テストにはほとんど暴力を書くために最適化された正ソリューション、思い付くなかった昨年、$ NOIP $。
$ソル$
再び限り$ O(N)$掃引は、限り現在の値が前の値よりも大きくなるように、その答えは、これら2つの値の累積的な絶対差である。$を超えます。$
$コード$
書式#include <iostreamの> の#include <cstdioを> に#define RG登録 の#defineは長い長いでしょ 使用して 名前空間はstdを、 int型読み取り() { int型、X = 0、Y = 1。char型のC; C = GETCHAR()。 一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ')Y = - 1 ; C = GETCHAR();} 一方(> = C ' 0 ' && C <=' 9 '){X =(X << 1)+(X << 3)+ C- ' 0 ' ; C = GETCHAR();} 戻りのx *のY。 } INT N; ANS LL; INT [ 100010 ]、B [ 100010 ]。 INT lowbit(INT X) { 戻り X&( - X)。 } ボイド追加(int型のx、int型K) { 用(RG int型 I = xを、I + = lowbit(I); iが<= N)B [I] + = K。 } LL和(INTX) { LL SUM1 = 0 。 用(RG int型 ; I> = I = xを1、I- = lowbit(I)) SUM1 + = B [i]は、 リターンSUM1。 } int型R、ミネソタ州、Lと、 INT メイン() { freopenは(" road.in "、" R " 、STDIN)。 freopenは(" road.out "、" W " 、STDOUT)。 N =読み取る();ミネソタ州= 2.1億。 用(RG int型i = 1 ; iが<= N; iが++ ) { [I] = (読み取り) ミネソタ州 = 分([I]、ミネソタ州)。 (I、[i]を追加 -a [I- 1 ])。 } ANS + = ミネソタ。 (追加1、 - ミネソタ州)。 もし([ 1 ] =!0)、L = 0 。 用(RG のint i = 1 ; I <= N; I ++ ) { int型、S = SUM(I)。 もし(S) { 場合(1- == 0){L = I; R = I; =のS;} そうでなければ {=分(単数または複数); R = I;} OW(I = N)!続けます。 } エルス OW(1- == 0)続けます。 ANS + = A。 (に追加 - A) OW(R <n)の数(R + 1 、A)。 I = 1、L = 0 。 } のprintf(" %のLLD " 、ANS) リターン 0 ; }
書式#include <iostreamの> の#include <cstdioを> に#define ILインライン の#define Rgを登録し ます。#defineは(私を、b)に行く(RG int型I = A;私は= Bの<; ++ i)に対する の#defineは長い長いっ 使用して 名前空間はstdを、 ILのINTのリード() { たRG INT X = 0、Y = 1。チャー C = GETCHAR()。 一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ')Y = - 1 ; C =GETCHAR();} 一方(> = C ' 0 ' && C <= ' 9 '){X =(X << 1)+(X << 3)+ C- ' 0 ' ; C = GETCHAR();} リターンのx *のY; } int型、N yはxと; LL として; INT ()は、メイン { N = 読み取ります()。 (I、行く1、N){Y =読み取り()。もし(Y> X)として + = Y-X; X = Y;} のprintf(" %LLDする\ n "、など)。 リターン 0 ; }