poj 1990 MooFest 樹狀陣列

2021-07-16 20:29:59 字數 864 閱讀 4387

第三道樹狀陣列模板題,但還是看了題解才會,好菜啊。。。。

首先,我們要確定這道題的基本思路,那就是對每乙個點(x0,v0),找到對應的其他點(其v值小於等於v0),並且算出其貢獻值。

看到小於等於,腦子裡立馬浮現出樹狀陣列!但是這道題比較麻煩,關鍵在於它的貢獻演算法比較奇葩,居然還要算x差的絕對值。那麼怎麼做呢?

關鍵就在於樹狀陣列存的是什麼東西(的和)!一般來說,按照套路,我們都是存x值的。這樣的話,我們可以算出x的和。

但是夠嗎?不夠!因為題目裡要算x差的絕對值,我們不妨把v值小於v0的點分為兩類,一類的x小於x0,一類的大於等於x0.最後可以得到

ans+=(cnt*a[i].x-sum+(total_sum-sum)-(i-cnt-1)*a[i].x)*a[i].v;

其中cnt為x值小於x0的點的個數,total_sum為目前所有點x值的總和,sum為所有x值小於x0的點的x值的總和。

sum可以通過我們上面說的那個樹狀陣列得到,而cnt就需要再建造乙個樹狀陣列了,這個樹狀陣列裡存的是x出現的次數。

下面貼**

#include#include#include#include#include#include#include#include#include#define ll long long

using namespace std;

const long long maxn=40000;

struct myk

;myk a[maxn];

long long n,tree1[maxn],tree2[maxn];//tree1 記錄x出現的總次數,tree2記錄x的和

bool cmp(myk aa,myk bb)

cout<

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...