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;

}


 

 

你可能感兴趣的:(poj)