poj 1990
借鉴cxlove大神的思路
题意:听力v,位置x,2个牛交流声音为max(v1,v2)*(x1-x2),求总的
10000^2 tle
用的树状数组做的,排序,2个,小于vi的牛的总数和距离总和
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 20005
int arr[maxn],s[maxn];
//pair<int , int> cow[MAXN]; 类似结构体
struct tree
{
int x,v;
}a[maxn];
int cmp(tree a,tree b)
{
return a.v<b.v;
}
int lowbit(int x)
{
return x&-x;
}
void update(int *a,int x,int val)
{
while(x<maxn)
{
a[x]+=val;
x+=lowbit(x);
}
}
int getsum(int *a,int x)
{
int sum=0;
while(x>0)
{
sum+=a[x];
x-=lowbit(x);
}
return sum;
}
int main()
{
int n,i,j;
while(scanf("%d",&n)!=EOF)
{
memset(arr,0,sizeof(arr));
memset(s,0,sizeof(s));
for(i=0;i<n;i++) scanf("%d%d",&a[i].v,&a[i].x);
__int64 ans=0,total=0;
sort(a,a+n,cmp);
for(i=0;i<n;i++Q){
update(arr,a[i].x,1);
update(s,a[i].x,a[i].x);
total+=a[i].x;
__int64 s_num=getsum(arr,a[i].x);
__int64 s_x=getsum(s,a[i].x);
ans+=a[i].v*(s_num*a[i].x-s_x+total-s_x-(i+1-s_num)*a[i].x);
}
printf("%I64d\n",ans);
}
return 0;
}
浙公网安备 33010602011771号