poj1990MooFest(树状数组)

一道好题

很容易想到用牛的v(i)值进行排序,显然当v值大的牛进行计算时,乘上的值为这头牛的v值,所以排序后的问题转化为如何快速求一头牛与所有v值小于等于它的牛的距离之和

这个时候很容易联想到树状数组去维护一个距离,但是麻烦是一头牛插入树状数组时,它的左右两边都有可能有牛,这个距离该怎么求呢?

联想到白书上P197的例7,我们发现用两个树状数组是挺不错的选择,一个维护右边的距离和,一个维护左边的距离和,这题就轻松解决了

不过要注意用long long,wa了一次就怪它!

AC代码

#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
const int maxn=20000+10;
ll BSTl[maxn],BSTr[maxn],l[maxn],r[maxn];
int N;
struct node
{
    int v,pos;
    bool operator <(const node &a)const
    {
        if(v!=a.v)return v


你可能感兴趣的:(poj1990MooFest(树状数组))