标签:des style color os io strong ar for art
| Time Limit: 1000MS | Memory Limit: 30000K | |
| Total Submissions: 5235 | Accepted: 2260 |
Description
Input
Output
Sample Input
4 3 1 2 5 2 6 4 3
Sample Output
57
————————————————————分割线——————————————
题目大意:
给定n头牛的听力和坐标,每两头牛交谈需要(max(v(i),v(j) )*abs(dis[i]-dis[j])),n头牛总共要交谈(n*(n-1)/2)次
思路:
对牛的听力进行从小到大排序,那么对于第i头牛 交谈,需要计算
1:坐标比第i头牛小的牛的数量 a,坐标和b
2:坐标比第i头牛大的牛的数量 c,坐标和d
那么第i头牛交谈总共需要:
(d-c*a[i].y+a*a[i].y-b)*a[i].x
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define M 20000+10
#define ll __int64
using namespace std;
ll b[M],c[M];
struct node
{
int x,y;
bool operator<(const node&a)const
{
return x<a.x;
}
}a[M];
void update(int x,int v,ll *h)
{
for(int i=x;i<=M;i+=i&-i){
h[i]+=v;
}
}
ll getsum(int x,ll *h)
{
ll sum=0;
for(int i=x;i>0;i-=i&-i){
sum+=h[i];
}
return sum;
}
int main()
{
int n;
scanf("%d",&n);
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(int i=1;i<=n;++i){
scanf("%d %d",&a[i].x,&a[i].y);
}
sort(a+1,a+1+n);
ll ans=0;
for(int i=1;i<=n;++i){
ll x1=(ll)(getsum(a[i].y,b)*a[i].y-getsum(a[i].y,c));
ll x2=(ll)(getsum(M,c)-getsum(a[i].y,c)-(i-1-getsum(a[i].y,b))*a[i].y);
ans+=(ll)(x1+x2)*a[i].x;
update(a[i].y,1,b);
update(a[i].y,a[i].y,c);
}
printf("%I64d\n",ans);
return 0;
}
标签:des style color os io strong ar for art
原文地址:http://blog.csdn.net/u014141559/article/details/38895505