POJ 1990 MooFest(树状数组好题)

本文详细解析了POJ 1990题目中奶牛沟通问题的算法实现,通过按奶牛的val值排序,计算每对奶牛间的交流结果并求和。采用树状数组优化计算过程,提供了完整的C++代码实现。
题目链接:

http://poj.org/problem?id=1990

题意:

给定 n n n个奶牛,每个奶牛有两个权值,第一个 p o s pos pos表示位置,每个点的 p o s pos pos均不相同,第二个表示 v a l val val表示奶牛声音传播属性,对于两个奶牛 ( x , y ) (x,y) (xy)之间的交流有一个结果,值等于 ∣ p o s x − p o s y ∣ \left| pos_x-pos_y\right| posxposy ∗ \ast m a x ( v a l x , v a l y ) max(val_x,val_y) max(valx,valy),求 ( n − 1 ) n 2 \frac{(n-1)n}{2} 2(n1)n对奶牛相互交流得到的这个结果的和;

分析:

       我们首先将奶牛按 v a l val val排序,那么对于奶牛 x x x,(下面说的之前并不是指距离,而是指按 v a l val val排序过后的相对位置);它之前的奶牛 y y y与它交流的 m a x ( v a l x , v a l y ) max(val_x,val_y) max(valx,valy)均等于 v a l x val_x valx,这时候我们对于每个奶牛 x x x,只需要计算它与它之前奶牛的距离 p o s pos pos的绝对值的和即可,那么如何计算 ∣ p o s x − p o s y ∣ \left| pos_x-pos_y\right| posxposy呢;
       对于每个奶牛 x x x之前的奶牛 y y y x x x的距离有两种可能,要么 p o s x &gt; p o s y pos_x&gt;pos_y posx>posy,要么 p o s x &lt; p o s y pos_x&lt;pos_y posx<posy;我们用 d i s &gt; dis_&gt; dis>代表位于 x x x之前的满足 p o s x &lt; p o s y pos_x&lt;pos_y posx<posy的所有 p o s y pos_y posy和即( ∑ p o s y \sum pos_y posy),同样有 d i s &lt; dis_&lt; dis<代表位于 x x x之前的满足 p o s x &gt; p o s y pos_x&gt;pos_y posx>posy的所有 p o s y pos_y posy和即( ∑ p o s y \sum pos_y posy),又有 n u m &gt; num_&gt; num>,代表 p o s x &gt; p o s y pos_x&gt;pos_y posx>posy y y y的个数,有 n u m &lt; num_&lt; num<,代表 p o s x &lt; p o s y pos_x&lt;pos_y posx<posy y y y的个数,那么有对于每个奶牛只要计算 ∑ i = 1 n v a l i ∗ ( n u m &lt; ∗ p o s x − d i s &lt; + d i s &gt; − n u m &gt; ∗ p o s x ) \sum_{i=1}^n val_i\ast(num_&lt;\ast pos_x-dis_&lt;+dis_&gt;-num_&gt;\ast pos_x) i=1nvali(num<posxdis<+dis>num>posx),这就是我们需要的答案, n u m num num d i s dis dis用两个树状数组求即可;

代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cmath>
#include<set>
#include<map>

using namespace std;

#define  inf 0x7f7f7f7f
#define  maxn 16041
#define  N 2
#define mod 100003

typedef long long ll;
typedef struct {
    int u, v, next, w;
} Edge;
Edge e[N];
int cnt, head[N];

inline void add(int u, int v) {
    e[cnt].u = u;
    e[cnt].v = v;
    //e[cnt].w=w;
    // e[cnt].f=f;
    e[cnt].next = head[u];
    head[u] = cnt++;
    //e[cnt].u=v;
//    e[cnt].v=u;
//    e[cnt].w=0;
//    e[cnt].f=-f;
//    e[cnt].next=head[v];
//    head[v]=cnt++;
}

inline void write(int x) {
    if (x < 0)
        putchar('-'), x = -x;
    if (x > 9)
        write(x / 10);
    putchar(x % 10 + '0');
}

inline int read() {
    int x = 0, f = 1;
    char c = getchar();
    while (c < '0' || c > '9') {
        if (c == '-')
            f = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        x = x * 10 + c - '0';
        c = getchar();
    }
    return x * f;
}
struct cow {
    ll pos, val;
};

bool compare(cow a, cow b) {
    return a.val < b.val;
}

cow c[22000];
ll maxm,n, dis[20200], cot[20200];

void insert(ll x, ll t[], ll val) {
    while (x <= 20040) {
        t[x] += val;
        x += x & -x;
    }
}

ll sum(ll x,ll t[]){
    ll res=0;
    while(x){
        res+=t[x];
        x-=x&-x;
    }
    return res;
}
int main() {
    while (cin >> n) {
        memset(dis,0,sizeof(dis));
        memset(cot,0,sizeof(cot));
        for (int i = 1; i <= n; i++) {
            scanf("%lld%lld", &c[i].val, &c[i].pos);
        }
        sort(c + 1, c + 1 + n, compare);
        ll ans = 0;
        ll did=0,dix=0,nud=0,nux=0;
        for (int i = 1; i <= n; i++) {
            dix=sum(c[i].pos,dis);
            did=sum(20040,dis)-dix;
            nux=sum(c[i].pos,cot);
            nud=sum(20040,cot)-nux;
            insert(c[i].pos,cot,1);
            insert(c[i].pos,dis,c[i].pos);
            ans+=c[i].val*(nux*c[i].pos-dix);
            ans+=c[i].val*(did-nud*c[i].pos);
        }
        cout<<ans<<endl;
    }
    return 0;
}

我们坚持一件事情,并不是因为这样做了会有效果,而是坚信,这样做是对的。
——哈维尔

源码下载地址: https://pan.quark.cn/s/a4b39357ea24 "ZV-1 高级功能使用手册 用户详细指南" 此文档将全面阐述 Sony ZV-1 相机的进阶功能及其操作方法,为用户呈现详尽的操作指引和配置范例。 一、使用指南与摄影技巧 * 本手册旨在协助用户迅速掌握 Sony ZV-1 相机的使用方法 * 提供摄影技巧与操作方法等实用信息 * 可在线查阅配件兼容性详情及配置范例 二、基础操作 * 通过控制轮和菜单选项将常用功能分配至按键 * 探索功能按钮(Fn)与自定义按键的应用 * 学习显示(DISP)按钮的操作方法 * 明确拍摄及浏览时图标与提示的展示方式 三、电源与存储介质 * 查询电池续航时间及可拍摄照片数量 * 注意电池使用规范及更换事项 * 掌握存储卡插入方法及注意事项 四、语言与时间设定 * 说明语言及时间配置流程 * 熟悉相机内部功能说明和拍摄模式选择 五、拍摄模式与对焦系统 * 探究拍摄模式和对焦模式的选择 * 了解自动对焦、人脸/眼部自动对焦设置及主体追踪功能 * 掌握手动对焦和直接手动对焦(DMF)操作 * 理解峰值对焦设置及拍摄模式选择 六、触控操作与视频录制 * 阐明触控功能特性及触控快门使用 * 学习触控对焦与触控追踪功能 * 掌握视频录制模式及高帧速率(HFR)设置 * 了解智能自动与场景识别程序 七、曝光调整与白平衡 * 熟悉曝光模式和白平衡配置 * 探究ISO感光度调节与变焦功能 * 学习自动HDR及动态范围优化(DRO)技术 八、图像处理与编辑功能 * 明确图像质量与文件格式选项 * 了解美肤效果与自动构图功能 * 掌握色彩空间选择与快门速度设置 * 探索降噪处理及高ISO降噪技术 九、闪光灯与人脸识...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值