POJ 1990(这个数字和我很有缘)

竟然刚开始没看懂题目的意思。
就是一组东西,各自有值,各自有着距离,求两两较大值和两两距离的积的和。如果用传统的方法,很慢。
涉及的东西:树状数组。关于这个的介绍:
百度文库http://baike.baidu.com/view/1420784.htm
夜幻梦回:http://www.cppblog.com/Ylemzy/articles/98322.html
不想写代码了,就粘了个过来:
转载自:Fatadaty:     http://www.cnblogs.com/Fatedayt/archive/2011/10/08/2202439.html
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAX(a,b) (a>b?a:b)
#define ABS(a) ((a)>0?(a):-1*(a))
#define TK(a) (a&(a^(a-1)))
#define N 20005
using  namespace  std;
 
struct  Node
{
     long  long  v,x;
     bool  operator <( const  Node & a) const
     {
         return  v<a.v;
     }
}node[N];
 
long  long  num[2][N];
long  long  rsum( int  pos, int  d)
{
     long  long  ans=0;
     while (pos>0)
     {
         ans+=num[d][pos];
         pos-=TK(pos);
     }
     return  ans;
}
 
void  toput( int  pos, long  long  v, int  d)
{
     while (pos<=20000)
     {
         num[d][pos]+=v;
         pos+=TK(pos);
     }
}
 
int  main()
{
     int  n;
     scanf( "%d" ,&n);
     memset(num,0, sizeof (num));
     for ( int  i=1;i<=n;i++)
         scanf( "%lld%lld" ,&node[i].v,&node[i].x);
     sort(node+1,node+1+n);
     long  long  ans=0;
     for ( int  i=1;i<=n;i++)
     {
         long  long  a=rsum(node[i].x,0),b=rsum(node[i].x,1);
         ans+=(node[i].x*a-b+rsum(20000,1)-b-(i-1-a)*node[i].x)*node[i].v;
         toput(node[i].x,1,0);
         toput(node[i].x,node[i].x,1);
     }
     printf( "%lld\n" ,ans);
}

谢谢
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值