【CF1037F]配列

問題の意味

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 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/GreenDuck/p/11409383.html