月赛 T1 求调
  • 板块学术版
  • 楼主FormulaOne
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/5/1 18:02
  • 上次更新2024/5/1 21:11:17
查看原帖
月赛 T1 求调
180406
FormulaOne楼主2024/5/1 18:02

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;
}
2024/5/1 18:02
加载中...