題意就是有n頭牛,每頭牛都有乙個座標和聲調值(x, v),兩頭牛之間通訊要花費的能量是他們的距離乘以最大的乙個音調值,現在要任意兩頭牛之間都相互通訊一次,求總共需要花費多少能量?
顯然總共有n*(n+1)/2條,我們可以用樹狀陣列儲存,樹狀陣列很適合求區間的和,我們只需要求出某頭牛左右兩邊分別有多少頭牛比它的音調小,且他們的座標和,這樣我們就能求出這頭牛到其他牛之間的距離和了,因為它的音調值已知且在這先中最大,然後這要求出一頭牛與其他比他小的通訊花費的能量了,然後以此求出其他的。這樣計算出了它小的,遍歷一遍後必然每頭牛之間都有裡通訊。
#include#include#define lowbit(x) (x&(-x))using namespace std;
const int max = 20005;
struct datacow[max];
int arnum[max], ardis[max];
bool cmp(data a, data b)
void add(int i, int *ar, int w)}
__int64 sum(int i, int *ar)
return ans;}
int main()
memset(arnum, 0, sizeof(arnum)); // 求向右的總能量。
memset(ardis, 0, sizeof(ardis));
for(i = n-1; i >= 0; i --)
printf("%i64d\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...