Problem O
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 60000/30000K (Java/Other)
Total Submission(s) : 33 Accepted Submission(s) : 16
Problem 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 <br> <br>* 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. <br>
Output
* Line 1: A single line with a single integer that is the sum of all the volumes of the conversing cows. <br>
Sample Input
4 3 1 2 5 2 6 4 3
Sample Output
57#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<cmath> #include<algorithm> #include<iomanip> using namespace std; typedef long long ll; #define inf 20010 ll c[2][20100]; struct node { int x,v; }; node a[20010]; bool cmp(node a,node b) { return a.v<b.v; } int lowbit(int i) { return i&(-i); } ll sum(int t,int i) { ll res=0; while(i>0) { res+=c[t][i]; i-=lowbit(i); } return res; } void add(int t,int i,int num) { while(i<=inf) { c[t][i]+=num; i+=lowbit(i); } } int main() { int i,j,n,t0; ll sumx,t1,ans,aa,b; scanf("%d",&n); ans=0; sumx=0; memset(c,0,sizeof(c)); for(i=1;i<=n;i++) scanf("%d%d",&a[i].v,&a[i].x); sort(a+1,a+1+n,cmp); for(i=1;i<=n;i++)//只计算与一出现的点的和为了避免重复 { sumx+=a[i].x; add(0,a[i].x,1); add(1,a[i].x,a[i].x); t0=sum(0,a[i].x);//表示比a[i].x距离小的点的个数 t1=sum(1,a[i].x);//表示比a[i].x小的点的距离之和 aa=t0*a[i].x-t1; b=sumx-t1-a[i].x*(i-t0);//实际上是sumx-t1-a[i].x-a[i].x*(i-1-t0) ans+=(aa+b)*a[i].v; } cout<<ans<<endl; } //题意 给出n头牛,求max(vi,vj)*abs(xi-xj)的和,首先求v好求,直接按v升序排序,那么怎么求距离之和,一个个求肯定超时, //我们需要知道比i点小的点的个数,及距离之和,很明显需要两个树状数组,一个房点数一个房距离之和