rt,调半天过不去,快崩溃了。大致思路是解个方程,求出每个点权。
#include <iostream>
#include <cstdio>
#include <algorithm>
#define int long long
using namespace std;
int n,cnt,a[2000001],c[2000001],d,v[2000001],mx = -0x7ffffff,mi = 0x7fffffff,sum,s;
signed main()
{
cin >> n;
for( int i = 1 ; i <= n ; i ++ )
cin >> a[i],sum += a[i];
for( int i = 2 ; i <= n ; i ++ )
{
d = a[i - 1] * 2ll;
d -= c[i - 1];
c[i] = d;
}
v[1] = ( a[n] * 2 - c[n] ) / 2;
mx = mi = v[1];
// cout << v[1] << ' ';
for( int i = 2 ; i <= n ; i ++ )
{
v[i] = a[i - 1] * 2ll - v[i - 1];
// cout << v[i] << ' ';
mx = max( mx , v[i] );
mi = min( mi , v[i] );
}
// cout << endl;
for( int i = 1 ; i <= n ; i ++ )
if( v[i] == mx )
{
for( int j = i ; j <= n ; j ++ )
cout << a[j] << ' ';
// cout << ( v[1] + v[n] ) / 2 << ' ';
for( int j = 1 ; j < i ; j ++ )
cout << a[j] << ' ';
cout << endl;
break;
}
for( int i = 1 ; i <= n ; i ++ )
if( v[i] == mi )
{
for( int j = i ; j <= n ; j ++ )
cout << a[j] << ' ';
// cout << ( v[1] + v[n] ) / 2 << ' ';
for( int j = 1 ; j < i ; j ++ )
cout << a[j] << ' ';
break;
}
return 0;
}