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;
}


 

 

posted on 2013-08-18 21:10  you Richer  阅读(155)  评论(0编辑  收藏  举报