poj 1990 MooFest (树状数组)
MooFest
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 4888 | Accepted: 2058 |
Description
Every year, Farmer John's N (1 <= N <= 20,000) cows attend "MooFest",a social gathering of cows from around the world. MooFest involves a variety of events including haybale stacking, fence jumping, pin the tail on the farmer, and of course, mooing. When the cows all stand in line for a particular event, they moo so loudly that the roar is practically deafening. After participating in this event year after year, some of the cows have in fact lost a bit of their hearing.
Each cow i has an associated "hearing" threshold v(i) (in the range 1..20,000). If a cow moos to cow i, she must use a volume of at least v(i) times the distance between the two cows in order to be heard by cow i. If two cows i and j wish to converse, they must speak at a volume level equal to the distance between them times max(v(i),v(j)).
Suppose each of the N cows is standing in a straight line (each cow at some unique x coordinate in the range 1..20,000), and every pair of cows is carrying on a conversation using the smallest possible volume.
Compute the sum of all the volumes produced by all N(N-1)/2 pairs of mooing cows.
Each cow i has an associated "hearing" threshold v(i) (in the range 1..20,000). If a cow moos to cow i, she must use a volume of at least v(i) times the distance between the two cows in order to be heard by cow i. If two cows i and j wish to converse, they must speak at a volume level equal to the distance between them times max(v(i),v(j)).
Suppose each of the N cows is standing in a straight line (each cow at some unique x coordinate in the range 1..20,000), and every pair of cows is carrying on a conversation using the smallest possible volume.
Compute the sum of all the volumes produced by all N(N-1)/2 pairs of mooing cows.
Input
* Line 1: A single integer, N
* Lines 2..N+1: Two integers: the volume threshold and x coordinate for a cow. Line 2 represents the first cow; line 3 represents the second cow; and so on. No two cows will stand at the same location.
* Lines 2..N+1: Two integers: the volume threshold and x coordinate for a cow. Line 2 represents the first cow; line 3 represents the second cow; and so on. No two cows will stand at the same location.
Output
* Line 1: A single line with a single integer that is the sum of all the volumes of the conversing cows.
Sample Input
4 3 1 2 5 2 6 4 3
Sample Output
57
Source
1 //600K 63MS C++ 1220B 2014-05-04 20:52:18 2 /* 3 4 题意: 5 知道v和x,求每对间 max(vi,vj)与abs(vi-vj)的乘积的和,对v排序,然后每个v的计算公式: 6 ans+=p[i].v*(cnt*p[i].x-sum+tsum-sum-(i-cnt-1)*p[i].x); 7 知道计算的方法还是挺简单的! 8 9 */ 10 #include<stdio.h> 11 #include<string.h> 12 #include<stdlib.h> 13 #define N 20005 14 struct node{ 15 int v,x; 16 }p[N]; 17 __int64 cnum[N],clen[N]; 18 int cmp(const void*a,const void*b) 19 { 20 return (*(node*)a).v-(*(node*)b).v; 21 } 22 int lowbit(int k) 23 { 24 return (-k)&k; 25 } 26 void update(__int64 c[],int k,int detal) 27 { 28 for(;k<N;k+=lowbit(k)) 29 c[k]+=detal; 30 } 31 __int64 getsum(__int64 c[],int k) 32 { 33 __int64 s=0; 34 for(;k>0;k-=lowbit(k)) 35 s+=c[k]; 36 return s; 37 } 38 int main(void) 39 { 40 int n; 41 while(scanf("%d",&n)!=EOF) 42 { 43 memset(cnum,0,sizeof(cnum)); 44 memset(clen,0,sizeof(clen)); 45 for(int i=1;i<=n;i++) 46 scanf("%d%d",&p[i].v,&p[i].x); 47 qsort(p+1,n,sizeof(p[0]),cmp); 48 __int64 ans=0; 49 update(cnum,p[1].x,1); 50 update(clen,p[1].x,p[1].x); 51 for(int i=2;i<=n;i++){ 52 __int64 cnt=getsum(cnum,p[i].x); 53 __int64 sum=getsum(clen,p[i].x); 54 __int64 tsum=getsum(clen,N-1); 55 ans+=p[i].v*(cnt*p[i].x-sum+tsum-sum-(i-cnt-1)*p[i].x); 56 update(cnum,p[i].x,1); 57 update(clen,p[i].x,p[i].x); 58 } 59 printf("%I64d\n",ans); 60 } 61 return 0; 62 }