设为首页 加入收藏

TOP

USACO 2004 OPEN Moofest(一)
2014-04-06 17:41:05 来源: 作者: 【 】 浏览:204
Tags:USACO  2004  OPEN  Moofest

  先按照坐标x进行排序,随后用归并排序对v进行排序。用部分和去求总和。

  #include

  #include

  const int maxn=20002;

  int v[maxn],x[maxn],n;

  int b[maxn],c[maxn];

  long long int ans;

  void swap(int *a,int *b)

  {

  int tmp=*a;

  *a=*b;

  *b=tmp;

  }

  void sort(int l,int r)

  {

  int key=x[rand()%(r-l+1)+l];

  int i=l,j=r;

  while(i<=j)

  {

  while(x[i]>key)

  i++;

  while(x[j]

  j--;

  if(i<=j)

  {

  swap(&x[i],&x[j]);

  swap(&v[i],&v[j]);

  i++;

  j--;

  }

  }

  if(l

  sort(l,j);

  if(i

  sort(i,r);

  }

  void merge_sort(int l,int r)

  {

  if(l==r)

  return;

  int mid=(l+r)/2;

  merge_sort(l,mid);

  merge_sort(mid+1,r);

  int p1=l,p2=mid+1;

  int i=l;

  long long int sum1=0,sum2=0;

  for(int i=p1;i<=mid;i++)

  {

  sum1+=v[i];

  }

  for(int i=p2;i<=r;i++)

  {

  sum2+=v[i];

  }

  while(p1<=mid || p2<=r)

  {

  if((p2>r)||(p1<=mid&&v[p1]>v[p2]))

  {

  ans += v[p1] * ((r-p2+1)*x[p1] - sum2);

  sum1-=v[p1];

  c[i]=x[p1];

  b[i++]=v[p1++];

  }

  else

  {

  ans+=v[p2]*((mid-p1+1)*x[p2]-sum1);

  sum2-=v[p2];

  c[i]=x[p2];

  b[i++]=v[p2++];

  }

  }

  for(int i=l;i<=r;i++)

  {

  x[i]=c[i];

  v[i]=b[i];

  }

  }

   

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇双平台下的计时函数总结 下一篇输出整形数据的最大值和最小值

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: