zoukankan      html  css  js  c++  java
  • MooFest POJ

    题意:n 头牛,每两头牛之间产生的价值是 max(a[i].v , a[j].v ) * |a[i].x - a[j].x|,问产生的总费用是多少

    题解:先将每头牛按照 v 的大小从小到大排序,那么就可以去掉一个绝对值并且只用当前的v的值去乘,之后用两个树状数组维护,一个树状数组维护比a[i].x小的牛有几头,另一个维护比a[i].x小的 x 的总和,之后 a[i].v * (sum1(a[i].x) * a[i].x - sum2(a[i].x)) 就是比它 x 小的费用总和,a[i].v * ((sum2[20000]  - sum2(a[i].x)) - sum1(20000) - sum1(a[i].x)) * a[i].x) 就是后面的总费用

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #include<list>
    #include<math.h>
    #include<vector>
    #include<stack>
    #include<string>
    #include<cstring>
    #include<string.h>
    using namespace std;
    typedef long long LL;
    #define ll LL
    #define bug printf("*********
    ")
    #define debug(x) cout<<#x"=["<<x<<"]" <<endl
    const int MAXN = 2e4 + 10;
    const double eps = 1e-8;
    const LL mod = 1000000007;
    
    LL sum1[MAXN],sum2[MAXN];
    struct node {
        int x,v;
    }a[MAXN];
    int lowbit(int x) {
        return x & -x;
    }
    
    void update1(int x,int y) {
        for(int i = x; i <= MAXN; i += lowbit(i))
            sum1[i] += y;
    }
    void update2(int x,int y) {
        for(int i = x; i <= MAXN; i += lowbit(i))
            sum2[i] += y;
    }
    
    LL getsum1(int x) {
        LL ans = 0;
        for(int i = x; i; i -= lowbit(i))
            ans += sum1[i];
        return ans;
    }
    
    LL getsum2(int x) {
        LL ans = 0;
        for(int i = x; i; i -= lowbit(i))
            ans += sum2[i];
        return ans;
    }
    
    void init() {
        memset(sum1,0,sizeof sum1);
        memset(sum2,0,sizeof sum2);
    }
    bool cmp(node x,node y) {
        return x.v < y.v;
    }
    int main()
    {
        init();
        int n;
        int M = 2e4;
        scanf("%d",&n);
        for(int i = 1; i <= n; i++)
            scanf("%d %d",&a[i].v, &a[i].x);
        sort(a + 1, a + 1 + n,cmp);
    
        LL ans = 0;
        for(int i = 1; i <= n; i++) {
    //        debug(getsum1(a[i].x));
    //        debug(getsum2(a[i].x));
    //        debug(getsum1(M) - getsum1(a[i].x));
    //        debug(getsum2(M) - getsum2(a[i].x));
            ans += a[i].v * (getsum1(a[i].x) * a[i].x - getsum2(a[i].x));
    //        debug(ans);
            ans += a[i].v * ((getsum2(M) - getsum2(a[i].x)) - (getsum1(M) - getsum1(a[i].x)) * a[i].x);
            update1(a[i].x,1);
            update2(a[i].x,a[i].x);
    //        debug(ans);
        }
        printf("%lld
    ",ans);
    }
  • 相关阅读:
    html文本超出自动换行、显示省略号
    angular第三天
    angular第二天
    angular第一天
    jQuery基础:keydown( ) 与 keypress( ) 区别
    jQuery基础:mouseeter( ) 与 mouseover( ) 区别
    jQuery基础:remove()与 detach()区别
    jQuery基础:获取元素内容
    (一)数组或对象中最会一个属性是否该加逗号的测试
    jQuery基础:prop()与attr()的区别
  • 原文地址:https://www.cnblogs.com/smallhester/p/11371436.html
Copyright © 2011-2022 走看看