POJ 1990 MooFest (樹狀陣列)

2021-07-28 15:17:41 字數 1417 閱讀 5384

每年,農夫約翰的n(1 <= n <= 20,000)只牛會參加「moofest」,乙個來自世界各地的牛的社交聚會。 moofest有許多活動,包括乾草堆積,籬笆跳躍,把尾巴釘在農夫的身上...當奶牛都站在同乙個地方排隊,他們會大聲喊叫,吼聲幾乎震耳欲聾。事實上,每年參加了這個活動後,一些奶牛已經失去了部分聽力。 

每個奶牛具有耳背值v(i)(在1..20,000的範圍內)。如果一頭牛向牛i吼叫,她必須使用至少是兩頭母牛之間距離的v(i)倍的聲音,以便被牛i聽到。如果兩個奶牛i和j想要交談,她們必須以等於她們之間的距離乘以max(v(i),v(j))的音量說話。 

假設n頭奶牛中的每頭奶牛都站在直線上(每頭奶牛在1..20,000範圍內的某個獨特x座標),每對奶牛都使用盡可能小的聲音進行談話。 

計算所有n(n-1)/ 2對正在說話的奶牛產生的所有聲音的總和。 

input

*第1行:單個整數,n 

*第2到n + 1行:兩個整數:牛的耳背值v和x座標。第2行代表第一頭牛;第3行表示第二頭牛;等等。沒有兩頭牛會站在同乙個位置。 

output

*第1行:僅含單個整數,表示所有牛互相吼叫的所有聲音的總和。 

sample input

4

3 12 5

2 64 3

sample output

思路:當兩頭牛進行計算時,用到的是v值大的牛。所以先按照v值從大到小排序,當計算某頭牛時,只考慮v值比它小的那些牛。我們用兩個樹狀陣列分別表示牛的座標之和及牛的數量之和(以座標作為陣列下標)。那麼考慮牛i時(按v從大到小排序後),設座標值比它小的那些牛的數目為num1、座標之和為sum1,座標值比它大的那些牛的數目為num2、座標之和為sum2,那麼對該牛而言(設座標為x,體力值為v),所貢獻的答案為v * ( x*num1-sum1 + sum2-x*num2 )。

#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int maxn = 20000 + 10;

struct node

}p[maxn];

int c1[maxn], c2[maxn], n, mx;

int lowbit(int x)

int sum(int *a, int x)

return ans;

}void add(int *a, int x, int v)

}int main()

sort(p+1, p+n+1);

ll ans = 0;

for(int i = 1; i < n; i++)

printf("%lld\n", ans);

return 0;

}

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