2013-09-18 08:12
由题可知,ans=∑i ∑j(x[i]-x[j])
最后整理完之后应该是不同系数的X[i]相加,所以这道题就成了求不同x[i]的系数
对于X[i],它需要减前面(i-1)个不同的数,所以系数先是(i-1),而计算它前
面的每个数时都需要被X[i]减,所以系数成了2*(i-1),而且X[i]会被后面(n-i)
个数减,且计算后面的x时,都会减x[i],所以需要减2*(n-i)所以系数就变成了
2*(2*i-n-1),累加每个即可
//By BLADEVIL var n :longint; i, j :longint; x :array[0..10010] of int64; ans :int64; procedure swap(var a,b:int64); var c :longint; begin c:=a; a:=b; b:=c; end; procedure qs(low,high:longint); var i, j, xx :int64; begin i:=low; j:=high; xx:=x[(i+j) div 2]; while i<j do begin while x[i]<xx do inc(i); while x[j]>xx do dec(j); if i<=j then begin swap(x[i],x[j]); inc(i); dec(j); end; end; if i<high then qs(i,high); if j>low then qs(low,j); end; begin assign(input,'volume.in'); reset(input); assign(output,'volume.out'); rewrite(output); read(n); for i:=1 to n do read(x[i]); qs(1,n); j:=n; for i:=n downto 1 do ans:=ans+(2*(i-1)-2*(n-i))*x[i]; writeln(ans); close(input); close(output); end.