我用李超树写为啥WA了,有没有巨佬帮忙看一下
(略过注释,毕竟人比较菜
#include <iostream>
using namespace std ;
#define int long long
int n , L , cnt ;
int t[20000005] ;
int s[500005] , f[500005] ;
struct Line
{
int k , b ;
} p[500005] ;
inline int A ( int x )
{
return x + s [ x ] ;
}
inline int B ( int x )
{
return x + s [ x ] + L + 1 ;
}
inline int calc ( int u , int x )
{
return p [ u ] .k * x + p [ u ] .b ;
}
void add ( int k , int b )
{
++ cnt ;
p [ cnt ] .k = k ;
p [ cnt ] .b = b ;
}
void change ( int k , int l , int r , int u )
{
// cout << l << " - " << r << " : " << u << endl ;
int v = t [ k ] ;
int mid = ( l + r ) >> 1 ;
int ru = calc ( u , A ( mid ) ) ;
int rv = calc ( v , A ( mid ) ) ;
if ( l == r )
{
if ( ru < rv )
t [ k ] = u ;
return ;
}
if ( p [ u ] .k > p [ v ] .k )
{
if ( ru < rv )
{
t [ k ] = u ;
change ( k << 1 | 1 , mid + 1 , r , v ) ;
}
else
change ( k << 1 , l , mid , u ) ;
}
else if ( p [ u ] .k < p [ v ] .k )
{
if ( ru < rv )
{
t [ k ] = u ;
change ( k << 1 , l , mid , v ) ;
}
else
change ( k << 1 | 1 , mid + 1 , r , u ) ;
}
else if ( p [ u ] .b > p [ v ] .b )
t [ k ] = u ;
}
int query ( int k , int l , int r , int x )
{
if ( x < l || r < x )
return 0 ;
if ( l == r )
return calc ( t [ k ] , A ( x ) ) ;
int res = calc ( t [ k ] , A ( x ) ) ;
int mid = ( l + r ) >> 1 ;
return min ( res , min ( query ( k << 1 , l , mid , x ) , query ( k << 1 | 1 , mid + 1 , r , x ) ) ) ;
}
void write ( int x )
{
if ( x > 9 )
write ( x / 10 ) ;
putchar ( x % 10 + '0' ) ;
}
signed main ( )
{
// freopen ( "P3195_2.in" , "r" , stdin ) ;
cin >> n >> L ;
for ( int i = 1 ; i <= n ; ++ i )
{
long long x ;
cin >> x ;
s [ i ] = s [ i - 1 ] + x ;
}
// p [ 0 ] .k = -2 * B ( 0 ) , p [ 0 ] .b = 0 ;
add ( -2 * B ( 0 ) , B ( 0 ) * B ( 0 ) + f [ 0 ] ) ;
change ( 1 , 1 , n , cnt ) ;
// cout << " continue : " << endl ;
for ( int i = 1 ; i <= n ; ++ i )
{
// puts ( " continue " ) ;
f [ i ] = query ( 1 , 1 , n , i ) + A ( i ) * A ( i ) ;
// puts ( " to 1 : " ) ;
add ( -2 * B ( i ) , B ( i ) * B ( i ) + f [ i ] ) ;
// puts ( " to 2 : " ) ;
change ( 1 , 1 , n , cnt ) ;
// puts ( " end : " ) ;
}
// for ( int i = 1 ; i <= n ; ++ i )
// cout << f [ i ] << " " ;
// cout << endl ;
write ( f [ n ] ) ;
return 0 ;
}
有哪位大佬愿意帮忙纠一下错嘛?