MooFest POJ

和Disharmony Trees HDU - 3015神似

// max(vi,vj) * |posi - posj| 
#include<stdio.h>  
#include<string.h>  
#include<algorithm>
using namespace std;
typedef long long ll;
#define maxn 20005
int tr1[maxn],tr2[maxn];
struct tree{
    int pos,val;
}Tr[maxn];
//按照位置排序 
bool cmp(tree e1,tree e2){
    return e1.pos<e2.pos;
}
int lowbit(int x)
{
    return x&(-x);
}
void add(int c[],int x,int v)
{
    for(int i=x;i<maxn;i+=lowbit(i))
        c[i]+=v; 
}
int query(int c[],int x)
{
    int ans = 0;
    for(int i=x;i;i-=lowbit(i))
        ans+=c[i];
    return ans;
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
        scanf("%d %d",&Tr[i].val,&Tr[i].pos);
    //按照位置排序 
    sort(Tr+1,Tr+1+n,cmp);
    memset(tr1,0,sizeof tr1);
    memset(tr2,0,sizeof tr2);
    long long ans=0,pos;
    int cnt;
    for(int i=1;i<=n;++i)
    {
        //比 a[i].val小的个数 
        cnt=query(tr1,Tr[i].val-1);
        //加进去 
        add(tr1,Tr[i].val,1);
        //比a[i].val小的数的坐标的和 
        pos=query(tr2,Tr[i].val-1);
        //加进去
        add(tr2,Tr[i].val,Tr[i].pos);
        ans+=(ll)Tr[i].val*(cnt*Tr[i].pos-pos);
    }
    memset(tr1,0,sizeof tr1);
    memset(tr2,0,sizeof tr2);
    for(int i=n;i>=1;--i)
    {
        cnt=query(tr1,Tr[i].val);
        add(tr1,Tr[i].val,1);
        pos=query(tr2,Tr[i].val);
        add(tr2,Tr[i].val,Tr[i].pos);
        ans+=(ll)Tr[i].val*(pos-cnt*Tr[i].pos);
    }
    printf("%lld
",ans);
}
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12288973.html