MooFest(树状数组+离线处理)

本文介绍了如何结合树状数组和离线处理技术来高效解决MooFest比赛中的复杂数据查询问题。通过实例解析,详细阐述了树状数组的构造、更新以及离线处理在优化查询效率方面的作用。
/* 

题意:

给你n头牛的位置x,和他们的音调v。 让我们求的是什么呢,求的是两头牛之间的(位置之差)*(两头牛中的最大的音调)。

我们按照v的大小从小到大排个序,从1-n依次扫一遍,当扫到第i头牛的时候,i的音调就最大,所以 如果求出位置差的和的话,问题就解决了、


简单的总结一下:
主要分两个数组的思路很是巧妙啊。
在将一个数插进去的时候,牛的位置不一定在哪,所有看看左边的有几头牛,右边有几头牛,然后分别求出左边的差的和,右边差的和,然后两边差的和相加再乘以这头牛的音调(因为在前i头牛中,这头牛的音调最大)。
我们在这里分两个数组用来干什么的呢? 第一个数组用计数,左边有几头牛,第二个数组用来求左边的牛的位置的和,那么左边的差的和就是(现在这头牛的位置*左边牛的个数-左边牛的位置的和)
*/ 
#if 0
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXX=20000+100;
int c[3][MAXX];
int lowbit(int x)
{
 return x&(-x);
}
void add(int p,int x,int v)
{
 for(; x<MAXX; x+=lowbit(x))
 {
  c[p][x]+=v;
 }
}
int sum(int p,int x)
{
 int sum=0;
 for(; x>0; x-=lowbit(x))
 {
  sum+=c[p][x];
 }
 return sum;
}
struct node
{
 int x,v;
 bool operator <(const node& b)const
 {
  return v<b.v;
 }
}nodes[MAXX];

int main()
{
 ios::sync_with_stdio(false);
 int n;
    while(cin>>n&&n)
    {
        memset(
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值