moofest

来源:互联网 发布:怎么使用同花顺软件 编辑:程序博客网 时间:2024/06/11 13:56

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. 
 

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
43 12 52 64 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 20010ll 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点小的点的个数,及距离之和,很明显需要两个树状数组,一个房点数一个房距离之和
 

Statistic | Submit | Back
原创粉丝点击