poj1990MooFest 樹狀陣列

2021-08-15 11:15:17 字數 595 閱讀 3268

一道好題

很容易想到用牛的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

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