데이터 구조 - 트 리 배열 (흑룡강성 제8 회 대학생 프로 그래 밍 경기 - post office)

9045 단어 Office
예제 원본:
제목:
1468: Post office
제목 설명
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. 
입력
  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.
출력
  For every query of each test case, you tell the minimum sum.
샘플 입력
3

1 2 3

2

1 3

2 3


샘플 출력
2
1
 x            n     ,     i  j    ,      post office,      post office      。
   ,       j-i+1         ,                !
 1 #include "stdio.h"

 2 #include "string.h"

 3 

 4 long long sum[1005];

 5 

 6 long long Low(long long x)  

 7 {

 8     return x&(-x);

 9 }

10 

11 long long SUM(long long x) //        

12 {

13     long long ans = 0;

14     for(long long i=x; i>0; i-=Low(i))

15         ans += sum[i];

16     return ans;

17 }

18 

19 int main()

20 {

21     long long n;

22     long long i,j,k;

23     long long x,y,Q;

24     long long mid;

25     while(scanf("%lld",&n)!=EOF)

26     {

27         memset(sum,0,sizeof(sum));

28         for(i=1; i<=n; ++i)

29         {

30             scanf("%lld",&k);

31             for(j=i; j<=n; j += Low(j))

32                 sum[j] += k;

33         }

34         scanf("%lld",&Q);

35         while(Q--)

36         {

37             scanf("%lld %lld",&x,&y);

38             mid = x+(y-x+1)/2;

39             if((y-x+1)%2==0)

40                 printf("%lld
",SUM(y)-SUM(mid-1)-(SUM(mid-1)-SUM(x-1))); 41 else 42 printf("%lld
",SUM(y)-SUM(mid)-(SUM(mid-1)-SUM(x-1))); 43 } 44 } 45 return 0; 46 }

좋은 웹페이지 즐겨찾기