Brick's Code

Brick's Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e7;
int n;
int a[maxn+5];
namespace A{
	int sm,L,mid;
	int b[maxn+5];
	inline void Work(){
		sm=0;for(int i=1;i<=n;i++) sm+=a[i];
		L=sm&1;
		b[n]=(n*L-sm)/2;
		sm=0;for(int i=2;i<=n;i+=2) sm+=L-a[i];
		b[n]-=sm;
		for(int i=n;i>=2;i--) b[i-1]=L-a[i]-b[i];
		mid=n/2+1;
		nth_element(b+1,b+mid,b+n+1);
		sm=0;for(int i=1;i<=n;i++) sm+=abs(b[i]-b[mid]);
		L-=2*b[mid];
		printf("%lld %lld",L,sm);
	}
}
namespace B{
	int L,sm,mid,m;
	int b[maxn+5];
	int c[maxn+5];
	inline void Work(){
		L=0;
		for(int i=1;i<=n;i+=2) sm+=a[i];
		for(int i=2;i<=n;i+=2) sm-=a[i];
		if(sm!=0) puts("-1 -1");
		else{
			b[n]=0;for(int i=n;i>=2;i--) b[i-1]=L-a[i]-b[i];
			for(int i=1;i<=n;i+=2) c[i/2+1]=b[i];
			for(int i=2;i<=n;i+=2) b[i/2]=b[i];
			m=n/2,mid=m/2+1,sm=0;
			nth_element(b+1,b+mid,b+m+1);
			for(int i=1;i<=m;i++) sm+=abs(b[i]-b[mid]);
			nth_element(c+1,c+mid,c+m+1);
			for(int i=1;i<=m;i++) sm+=abs(c[i]-c[mid]);
			L=-b[mid]-c[mid];
			printf("%lld %lld",L,sm);
		}
	}
}
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	if(n&1) A::Work();
	else B::Work();
	return 0;
}
posted @ 2024-05-08 22:27  DeepSeaSpray  阅读(2)  评论(0编辑  收藏  举报