hdu 1541 Stars 樹狀陣列

2021-06-18 01:05:58 字數 1171 閱讀 9587

題意:大概就是計算每顆星星左下邊包括了多少顆星星,這個數值就是level。左下邊不包括本身,不超過本身的x,y的座標,可以等於。問每種level有多少顆星星。

這題,一開始想不到怎麼用到樹狀陣列,後來看了一下,發現題目給的資料是已經按x,y排好序的。所以我們可以不用管y的值,為什麼呢?

我們乙個星星乙個星星的讀取進來它的座標,因為它先要把y相等的星星全輸出完了,而且是按x遞增的方式輸出的,然後再會增大y,繼續讀入之後的星星座標,

所以我們用樹狀陣列最好了,先看一排的星星座標,也就是先不管y,只看y值相同的星星座標的x。設a[i]表示x軸座標為i的點的level,這個level包括了它本身。

因為x是遞增輸入的,當乙個x輸入時,它之後的所有星星的level值肯定都要加一,即x和大於它的a陣列值都要加一,這是肯定的。這點就是樹狀陣列的最基本應用-單點更新。所以橫的x軸處理完了。

那麼縱的y軸怎麼處理呢?

我們發現,當處理完了一排星星座標時,下次讀入的星星座標肯定是y增大了,x變沒變小不一定,而且我們此時的樹狀陣列裡已經存下了之前讀入進來的星星的座標了,那麼此時我在y增大的情況下,再讀入乙個星星座標,那麼這個星星的level是不是就剛好等於它之前已經處理過了的所有a[i](i小於等於這個點的x)的值和了,為什麼可以等於?因為你現在還沒有對這個點的x的值進行單點更新,故它沒有包括自己本身這個點,只是包括了y小於自己的y的x和自己相等的a[x]罷了。所以這裡的求a[0]+a[1]+.....+a[x]的和剛好又用到的是樹狀陣列的另乙個最基本的應用-區間求和。

所以此題是樹狀陣列的基本應用。

注:此題的x座標可以為0,而樹狀陣列是從1開始的,所以處理的時候對每個x座標進行加一即可。輸出從level=0,開始。

**如下:

#include #include #include using namespace std;

#define n 32001

int c[n];

int num[n];

int t;

int lowbit(int x)

void add(int pos,int num)

}int sum(int end)

return sum;

}int main()

for(i = 0; i < t; i ++)

}return 0;

}

HDU 1541 Stars(樹狀陣列)

題目鏈結 解析 題意 大概就是計算每顆星星左下邊包括了多少顆星星,這個數值就是level。左下邊不包括本身,不超過本身的x,y的座標,可以等於。問每種level有多少顆星星。這題,一開始想不到怎麼用到樹狀陣列,後來看了一下,發現題目給的資料是已經按x,y排好序的,所以我們可以不用管y的值。注意 1....

HDU 1541 Stars 樹狀陣列

題義為給定n個點按照先x軸,後y軸座標排序,求某一點的左下角的星星數量,剛開始用二維的樹狀陣列來做,結果肯定是記憶體不過用。該題正解為在給定的座標點的排序後,只對x軸座標建立乙個一維陣列,對於當前狀態按x軸將平面劃分成m個區域,由於給定的點的y軸座標一定是當前最高的,所以直接對橫座標前求和即可。如下...

hdu1541 Stars 樹狀陣列

有n個點 xi,yi 輸入時保證按y公升序,即先按y小的輸入,y相同時按x公升序輸入 如果對於 xi,yi 來說,位於x yi y yi區域的點有ki個 則level ki 最終輸出level 0 到level n 1 的值 思路 的題主忘了初始化c陣列hhhh 其實亂序的話,按加粗題排序一下也能搞...