POJ 1990 MooFest 樹狀陣列

2021-06-27 07:30:59 字數 845 閱讀 9670

題意:牛的聽力為v,兩頭牛i,j之間交流,需要max(v[i],v[j])*dist(i,j)的音量。求所有兩兩頭牛交談時音量總和∑(max(v[i],v[j])*abs(x[j]-x[i])) ,x[i]表示i的座標

解法:將牛按聽力從小到大排序,這樣就可以使每次算一頭牛與別的牛的值時聽力永遠取自己的聽力。

建兩棵樹狀陣列,一顆維護牛的座標,一顆維護牛的個數。

當遍歷到某頭牛 i 時,求出它的左邊有多少頭牛,記為l,右邊記為r,並且算出左邊的座標之和lsum,右邊座標值的和rsum。

那麼此時 總的和要加上 (l*x[i]-lsum)*v[i] (左邊) +  (rsum-r*x[i])*v[i] (右邊), 仔細想想就知道了。

**:

#include #include 

#include

#include

#include

#include

using

namespace

std;

#define n 20007

intc[n],cnt[n],n,maxi;

struct

node

p[n];

int cmp(node ka,node kb)

int lowbit(int x)

void modify(int *c,int x,int

val)

int getsum(int *c,int

x)

return

res;

}int

main()

cout

}return0;

}

view code

POJ 1990 MooFest 樹狀陣列

思路 定義兩棵樹狀陣列,第乙個記錄座標個數和,第二個記錄橫座標和。對volumn從小到大排序,保證遍歷更新的時候當前的volumn取最大。lescnt表示前i 1個比第i個橫座標小的cow的總數。lessum表示前i 1個橫座標比當前小的橫座標之和 bigcnt表示前i 1個比當前橫座標大的cow的...

poj 1990 MooFest 樹狀陣列

題意就是有n頭牛,每頭牛都有乙個座標和聲調值 x,v 兩頭牛之間通訊要花費的能量是他們的距離乘以最大的乙個音調值,現在要任意兩頭牛之間都相互通訊一次,求總共需要花費多少能量?顯然總共有n n 1 2條,我們可以用樹狀陣列儲存,樹狀陣列很適合求區間的和,我們只需要求出某頭牛左右兩邊分別有多少頭牛比它的...

POJ 1990 MooFest 樹狀陣列

題意 就算每兩頭牛之間聲音值 2頭牛v的最大值 2頭牛之間的距離 思路 按照v從小到大插入樹狀陣列 因為從小到大排序 每插入一頭牛i 當前v最大值就是牛i的v 統計x比他小的個數s1 x比他大的個數s2 s2 就是當前樹狀陣列牛的數量減去s1在減一 統計x比他小的距離l1 和 x比他大的距離l2 l...