Post office |
||
|
||
description |
||
There are N(N<=1000) villages along a straight road, numbered from 1 to N for simplicity. We know exactly the position of every one (noted pos[i],pos[i] is positive integer and pos[i]<=10^8). The local authority wants to build a post office for the people living in the range i to j(inclusive). He wants to make the sum of |pos[k]-position_of_postoffice| (i<=k<=j) is minimum.
|
||
input |
||
For each test case, the first line is n. Then n integer, representing the position of every village and in acending order. Then a integer q (q<=200000), representing the queries. Following q lines, every line consists of two integers i and j. the input file is end with EOF. Total number of test case is no more than 10.
Be careful, the position of two villages may be the same.
|
||
output |
||
For every query of each test case, you tell the minimum sum.
|
||
sample_input |
||
3
1 2 3
2
1 3
2 3
0
|
||
sample_output |
||
2
1
|
||
hint |
||
Huge input,"scanf" is recommend.
|
可以用dp进行一下预处理=。=
但是!!!!暴力也能过!!!!!
------------------
#include <iostream> #include <cstdio> #include <cstring> using namespace std; long long a[1111]; long long f[1111]; long long g[1111]; int n; int q; int main() { while (~scanf("%d",&n)) { if (n==0) break; memset(a,0,sizeof(a)); memset(f,0,sizeof(f)); memset(g,0,sizeof(g)); for (int i=1;i<=n;i++) { scanf("%I64d",&a[i]); f[i]=f[i-1]+a[i]; } for (int i=n;i>=1;i--) { g[i]=g[i+1]+a[i]; } scanf("%d",&q); while (q--) { int x,y; scanf("%d%d",&x,&y); int mid=(x+y)/2; long long ans=(a[mid]*(mid-x)-(f[mid-1]-f[x-1]))+((g[mid+1]-g[y+1])-a[mid]*(y-mid)); printf("%I64d\n",ans); } } return 0; }