社区讨论

求调

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 条回复,欢迎继续交流。

正在加载回复...