1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std;
#define LL long long
LL read(){ LL s=0,ne=1; char c=getchar(); for(;c<'0'||c>'9';c=getchar()) if(c=='-') ne=-1; for(;c>='0'&&c<='9';c=getchar()) s=((s<<1)+(s<<3))+c-'0'; return s*ne; }
const int CN=1e6+6;
LL n,x1,a[CN],c[CN],_a,rec[CN]; LL llabs(LL a) {return a>0 ? a:-a;}
int main() { n=read(); LL sigma = 0; for(int i=1;i<=n;i++) a[i] = read(),sigma += a[i]; _a = sigma/n; //求平均值 rec[0] = c[0] = 0; for(int i=1;i<=n;i++) rec[i] = c[i] = c[i-1]+a[i]-_a; //递推c[i] sort(c+1,c+n+1); x1 = c[(n+1)/2]; //计算中位数 LL ans=0; for(int i=1;i<=n;i++) ans += llabs(x1-c[i]); //求代价 printf("%lld\n",ans); for(int i=1;i<n;i++) printf("%lld %lld\n",x1-rec[i-1],-(x1-rec[i])); //输出搬运数 printf("%lld %lld",x1-rec[n-1],-x1); //处理环 return 0; }
|