moofest

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

Statistic  |   Submit  |   Back
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值