社区讨论
求调
P3195[HNOI2008] 玩具装箱参与者 1已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo8my8ny
- 此快照首次捕获于
- 2023/10/27 21:15 2 年前
- 此快照最后确认于
- 2023/10/27 21:15 2 年前
CPP
// Num[i] = Sum[i] + L + 1
//Ans[i] = Ans[l] + ( Sum[i] - Num[l]) * ( Sum[i] - Num[l])
//Ans[l] + Sum[i] * ( Sum[i] - Num[l] ) - Sum[l] * ( Sum[i] - Num[l] )
//Ans[l] + Num[l] ^ 2 = 2 * Sum[i] * Num[l] + Ans[i] - Sum[i] ^ 2
// Y = K * X + B
#include<bits/stdc++.h>
using namespace std ;
const int Maxs = 50010 , TIL = ( 1 << 28 ) ;
long long Ans[Maxs] , Sum[Maxs] , Num[Maxs] ;
int n ; long long L ;
long long C[Maxs] ;
long long Y( int i ) { return Ans[i] + Num[i] * Num[i] ; }
long long X( int i ) { return Num[i] ; }
int Q[Maxs] , Top , Til ;
int main( ) {
scanf("%d%lld" , &n , &L ) ;
for(int i = 1 ; i <= n ; i ++ ) {
Ans[i] = 1e18 ;
scanf("%lld" , &Sum[i] ) ;
Sum[i] += Sum[i - 1] ;
}
for(int i = false ; i <= n ; i ++ ) Sum[i] += i ;
for(int i = false ; i <= n ; i ++ ) Num[i] = Sum[i] + L + 1 ;
for( int i = 1 ; i <= n ; i ++ ) {
while( Top < Til && Y(Q[Top + 1]) - Y(Q[Top]) <= ( 2 * Sum[i] ) * ( X(Q[Top + 1] ) - X(Q[Top]) ) ) Top ++ ;
int l = Q[Top] ; Ans[i] = Ans[l] + ( Sum[i] - Num[l]) * ( Sum[i] - Num[l] ) ;
while( Top < Til && ( Y(Q[Til]) - Y(Q[Til - 1]) ) * ( X(i) - X(Q[Til - 1]) ) >= ( Y(i) - Y(Q[Til - 1]) ) * ( X(Q[Til]) - X(Q[Til]) ) ) Til -- ;
Q[ ++ Til ] = i ;
}
printf("%lld\n" , Ans[n] ) ;
return 0 ;
}
WA0
回复
共 2 条回复,欢迎继续交流。
正在加载回复...