樹狀陣列,HDOJ2494

2021-06-16 11:08:16 字數 1023 閱讀 5360

幾個打桌球的漢子住在一條直線上,他們每個人都有乙個rank值,現在他們要比賽,就得選乙個人當裁判,裁判只能住在比賽兩個人的房子之間,而且rank值也必須在比賽兩個人之間。現在問一共能打多少場比賽~~

直觀就是列舉裁判的位置,那麼ans=∑(l(i)*r(i)+(i-(l(i))*(n-i-1-(r(i)))))。

也就是左邊比他低的乘以右邊比他高的  和   左邊比他搞的乘以右邊比他低的。

這裡可以用樹狀陣列線段樹等等資料結構。

在這裡再回顧下樹狀陣列。

維護陣列 lb[ ] 記錄c[ ]表示的求和範圍 lb[ i ]=i&(-i);

陣列c[ i ]記錄a[ i - lb[ i ] ]+...+a[ i ] 的值。

如果改變某個a[ i ]的值,對應的右邊所有覆蓋了 a[ i ]的c[ ]都要改變。

while (num<=mx)

接下來求和

int sum(int i)

現在回到這個題,如果用rank值做陣列下標,那麼對於第 i 次插入的位置 a[ i ],其左邊的都是rank小於 i 的,並且已記錄的都是住房位置在其左邊的,那麼就很好理解用樹狀陣列做了。

#include#include#include#includeusing namespace std;

__int64 a[20010],wb[100010],b[100010],l[20010],r[20010],mx;

__int64 cnt(__int64 num)

return sum;

}void ins(__int64 num)

return ;

}int main()

__int64 ans=0;

for (i=0;ians+=(l[i]*(n-i-1-r[i])+r[i]*(i-l[i]));

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

}return 0;

}

HDOJ 1541 樹狀陣列

題目 題意 給一組星星,每顆星星左下角有多少個星星他就是多少級。然後輸出沒級星星個數。題目按y公升序。所以只要考慮x。因為x,y的範圍不大。只有32000,所以可以建立樹狀陣列了。include define pi 3.1415926 define inf 1e18 define inf 1e9 d...

樹狀陣列 HDOJ 1541 Stars

剛開始一點都不覺得是樹狀陣列。有很長一段時間覺的排個序就行了。直到重新讀題發現輸入是按順序的。不過值得注意的是輸入的x,y可能是0,但是在樹狀陣列中是不能為0的。最後加上乙個十分酷炫 喪心病狂 的輸入優化,直接跑第一面了。include include include include include...

HDOJ 1541 star 樹狀陣列)

這道題告訴我們若干顆星星的座標,告訴我們的時候y座標已經按照公升序排列了。對於每一顆星,它的等級數等於它左邊和左上角星星的顆數。最後問每一顆星星的等級。把星星按照給我們的順序 就是y座標從小到大的順序 依次把乙個陣列中下標為x的元素加1。對於某一顆星,座標為x,那麼把陣列中下標為x及之前的所有元素相...