アイデア:
$ 90pts $:
明らかに喜びの最小最大度、および最大プレフィックスを作るために、あなたはメンテナンスを列挙することができます。
#include <ビット/ STDC ++ H> のconst int型 INF = 1 << 30 。 const int型 MAXN = 100050 ; typedef int型INTT。 #defineは長い長いint型 使用して 名前空間はstdを、 int型 N、ANS = W - INF、[MAXN]、B [MAXN]、SUM1 [MAXN]、SUM2 [MAXN]。 int型リード(){ int型のx = 0 。 ブール記号= 偽; チャー、α= 0 。 一方、(!isdigit(アルファ)){ 記号| =アルファ== ' - ' ; アルファ = GETCHAR()。 } 一方(isdigit(アルファ)){ X =(X << 1)+(X << 3)+(アルファ^ 48 )。 アルファ = GETCHAR()。 } リターン記号?- X:X; } INTTメイン(){ N = 読み取ります()。 W = 読み取り(); 用(int型 iは= 1 ; iが<= N iが++ ){ [I] = (読み取り) SUM1 [I]= SUM1 [I - 1 ] + [I]。 } のために(int型 I = 1を iが++; iが<= N ){ B [i]は。= READ(); SUM2 [I] = SUM2 [I - 1 ] + のB [i]は、 } のための(int型 i = 1 ; iが<= N; iが++ ){ ため(INT J = 1 ; J <= N; J ++ ) ANS = MAX(ANS、分(SUM1 [N] - SUM1 [N - i]は、 SUM2 [N] - SUM2 [N - J]) - 1LL×(iはJ + 1)* W)。 } COUT << ANS <<てendl; リターン 0 ; }
$ 100pts $:
私たちは、最初のグループの選択は、あなたが最小値の後半は、最初のグループ、統計的な答えよりも大きい場合に設定できることを前提としています。
第2のグループはまた、あなたが最大値を見つけることができ、再びこれを行います。
#include <ビット/ STDC ++ H> のconst int型 INF = 1 << 30 。 const int型 MAXN = 100050 ; typedef int型INTT。 #defineは長い長いint型 使用して 名前空間はstdを、 int型 N、P1、P2、ANS1 = -INF、ANS2 = W - INF、RES、L、R、[MAXN]、B [MAXN]、SUM1 [MAXN]、SUM2 [MAXN]。 int型リード(){ int型のx = 0 。 ブール記号= 偽; チャー、α= 0 。 しばらく(!isdigit(アルファ)){ 記号 | =アルファ== ' - ' 。 アルファ = GETCHAR()。 } 一方(isdigit(アルファ)){ X =(X << 1)+(X << 3)+(アルファ^ 48 )。 アルファ = GETCHAR()。 } リターン記号?- X:X; } ブール CHECK1(int型のx、int型の Y){ 戻り SUM2 [N] - SUM2 [N - X]> = Y。} ブール CHECK2(INT X、INTY){ 戻り SUM1 [N] - SUM1 [N - X]> = Y。} INTTメイン(){ N = 読み取ります()。 W = 読み取り(); 用(int型 iは= 1 ; iが<= N iが++ ){ [I] = (読み取り) SUM1 [I] = SUM1 [I - 1 ] + [I]。 } のために(int型 I = 1を iが++; iが<= N ){ B [i]は。= READ(); SUM2 [I] = SUM2 [I - 1 ] + のB [i]は、 } のために(int型 i = 1 ; iが++; iが<= N ){ RESの =のSUM1 [N] - SUM1 [N - I]。 L = 1、R = N。 一方、(L <= R){ int型ミッド=(L + R)>> 1 。 もし(CHECK1(MID、RES)){ ANS1 = MAX(ANS1、RES - (iはミッド+)* W)。 R =ミッド- 1 。 } 他 L =ミッド+ 1 。 } } のために(int型 I = 1 ; I <= N。I ++ ){ RESの =のSUM2 [N] - SUM2 [N - I]。 L = 1、R = N。 一方、(L <= R){ int型ミッド=(L + R)>> 1 。 もし(CHECK2(MID、RES)){ ANS2 = MAX(ANS2、RES - (iはミッド+)* W)。 R =ミッド- 1 。 } 他 L =ミッド+ 1 。 } } COUT<< MAX(ANS1、ANS2)<< ENDL。 リターン 0 ; }