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

被折叠的 条评论
为什么被折叠?



