zoukankan      html  css  js  c++  java
  • POJ 1990 MooFest 树状数组

    有N头牛在一个数轴上,每头牛有一个听力值,两头牛交谈时花费为,距离差值与较大的听力值值和。问所有牛两两交谈所需要的花费之和。

    我们先考虑将距离差值与听力值两个变量固定一个。我们将所有牛按照听力值从小到大排序。这样子一头牛与其左侧的牛交谈时,在听力值上花费就是其本身的听力值。我们再考虑如何高效地求出这头牛与听力值小于他的所有牛的距离差值之和。求当前牛对答案的贡献,我们只关心听力值比他小的牛。所以我们可以按照听力值从小到大排序的方式,边将所有牛的位置加入一个数据结构,边求答案。我们维护两个树状数组,一个用来统计所有位置的牛的个数,一个用来统计所有位置牛的位置和。每次求答案时,我们便能统计出所有听力值小于当前牛的个数与其坐标之和。然后就能求出当前牛对答案的贡献,然后再将当前牛加入树状数组为以后的计算做准备。

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    typedef long long ll;
    const int MAXN = 21000;
    struct dat
    {
        ll v,x;
        friend bool operator < (dat a,dat b)
        {
            return a.v < b.v;
        }
    } vec[MAXN];
    ll num[2][MAXN],ans;
    int n;
    int lowbit(int x)
    {
        return x & (-x);
    }
    ll sum(int x,int d)
    {
        ll ans = 0;
        for (;x > 0;x -= lowbit(x)) 
            ans += num[d][x];
        return ans;
    } 
    void add(int x,ll v,int d)
    {
        for (;x <= 20000;x += lowbit(x))
            num[d][x] += v;
    }
    int main()
    {
        scanf("%d",&n);
        memset(num,0,sizeof(num));
        for (int i = 1;i <= n;i++)
            scanf("%lld%lld",&vec[i].v,&vec[i].x);
        sort(vec + 1,vec + 1 + n);
        for (int i = 1;i <= n;i++)
        {
            ll ta = sum(vec[i].x,0),tb = sum(vec[i].x,1);
            ans += (vec[i].x * ta - tb + sum(20000,1) - tb - (i - 1 - ta) * vec[i].x) * vec[i].v;
            add(vec[i].x,1,0);
            add(vec[i].x,vec[i].x,1);
        }
        printf("%lld
    ",ans);
        return 0;
    }
    心之所动 且就随缘去吧
  • 相关阅读:
    2、容器初探
    3、二叉树:先序,中序,后序循环遍历详解
    Hebbian Learning Rule
    论文笔记 Weakly-Supervised Spatial Context Networks
    在Caffe添加Python layer详细步骤
    论文笔记 Learning to Compare Image Patches via Convolutional Neural Networks
    Deconvolution 反卷积理解
    论文笔记 Feature Pyramid Networks for Object Detection
    Caffe2 初识
    论文笔记 Densely Connected Convolutional Networks
  • 原文地址:https://www.cnblogs.com/iat14/p/12053733.html
Copyright © 2011-2022 走看看