这个题没有李超树的写法吗
查看原帖
这个题没有李超树的写法吗
562582
吾名有灵楼主2021/9/14 23:04

我用李超树写为啥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 ;
}

有哪位大佬愿意帮忙纠一下错嘛?

2021/9/14 23:04
加载中...