竟然刚开始没看懂题目的意思。
就是一组东西,各自有值,各自有着距离,求两两较大值和两两距离的积的和。如果用传统的方法,很慢。
涉及的东西:树状数组。关于这个的介绍:
百度文库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);
}
谢谢
|
POJ 1990(这个数字和我很有缘)
最新推荐文章于 2018-11-01 19:40:19 发布