問題の意味
https://codeforces.com/contest/1037/problem/F
考えます
より興味深いアプローチからの抜粋。私たちは、の中央部分にわたって各統計的貢献を分割し、シーケンスを征服します。唯一の各間隔は半ばに対応しています。これは、精度を確保することです。左間隔について、その最大延長を計算します。
次に、左から右とすべての点の範囲を列挙するために右に。点$ Iの$のために、その上のスパン部の右端には、$ K-1 $です。したがって、同一の左ブロック毎の最大値の右に加えて、残りのプレフィックスの寄与は(K-1)左及び間隔によって決定する(最大延長)をスパンします。
コードは小さいですが、多くの詳細。優れたアルゴリズムの複雑さは$ O(nlogn)$が、すべての後ではあるが、この種の問題を解決します。
コード
1の#include <ビット/ STDC ++ H> 2 の#define MOD十億七 3 使用して 名前空間STDを、 4 typedefの長い 長い int型LL。 5 のconst int型 MAXN = 1E6 + 5 。 6 INTのN、K。 7つの LLのANS、[MAXN]、MAXX [MAXN]和[MAXN]。 8 インラインLL最大(LLのX、LLのY) 9 { 10 リターン X> Y?X:Y。 11 } 12 空隙解く(int型 L、INT R) 13 { 14 もし(R-L + 1 < K) 15 リターン。 16 INT半ば=(L + R)>> 1 。 17 MAXX [ミッド] = [中間]を。 18 のために(int型 I =半ば1 ; I> = L; - I) 19 MAXX [I] = MAX(MAXX [I + 1 ]、[I])。 20 和1- [ 1 ] = 0 。 21 和[L]は= MAXX [L]を、 22 のために(int型 iはL + = 1 ; iが=半ばを<++ i)が 23 { 24 和[I] = 0 ; 25台の int型の POS = I-K + 1 。 26 であれば(POS> = L) 27 和[I] = 和[POS]。 28 和[I] =(SUM [I] + MAXX [I])%MOD。 29 } 30は 今= llの[中間+ 1 ]。 31 のためには、(int型 I =中間+ 1、J =半ばと、I <= R; ++ I、今= MAX(ここで、[I])) 32 { 33 であれば(I-L + 1 < k)を 34 続けます。 35 一方(J> = L && MAXX [J] <今) 36 - J。 37 INT LEN = I-J + 1 。 38 INTのブロック=(len- 2)/(K- 1 )。 39 INT アウト =ブロック+ 1 。 40 ブロック- =(I-ミッド1)/(K- 1 )。 41 のANS =(ANS +ブロック*今%MOD +和[MAX(1- 1、I- アウト(* K- 1))])%MOD。 42 } 43 (L、中間)を解く、(MID +解決1 、r)を。 44 } 45 INTmain()の 46 { 47の IOS :: sync_with_stdio(偽)。 48 CIN >> N >> K。 49 のために(int型 i = 1 ; iが<= N ++ I) 50 CINを>> [I]。 51 (解決1 、N)。 52 COUT << ANS << ENDL。 53 リターン 0 ; 54 }