poj 2352 Stars 樹狀陣列or線段樹

2021-07-11 05:47:14 字數 1284 閱讀 6764

題目大意:

在座標上有n個星星,如果某個星星座標為(x, y), 它的左下位置為:(x0,y0),x0<=x 且y0<=y。如果左下位置有a個星星,就表示這個星星屬於level x

按照y遞增,如果y相同則x遞增的順序給出n個星星,求出所有level水平的數量。

分析:

因為輸入是按照按照y遞增,如果y相同則x遞增的順序給出的, 所以,對於第i顆星星,它的level就是之前出現過的星星中,橫座標x小於等於i星橫座標的那些星星的總數量(前面的y一定比後面的y小)。

所以,需要找到一種資料結構來記錄所有星星的x值,方便的求出所有值為0~x的星星總數量。

樹狀陣列和線段樹都是很適合處理這種問題。

樹狀陣列:

#include

#include

#include

using

namespace

std;

const

int n=32005;

int c[n],level[n];

int lowbit(int x)

int getsum(int x)

void add(int x)

for(int i=0;iprintf("%d\n",level[i]);

}return

0;}

線段樹:

#include

#include

#include

using

namespace

std;

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

const

int n=15005;

const

int m=32009;

int sum[m<<2];

int level[n];

void pushup(int rt)

int query(int a,int b,int l,int r,int rt)

void update(int x,int l,int r,int rt)

int m=(l+r)>>1;

if(x<=m)update(x,lson);

else update(x,rson);

pushup(rt);

}int main()

for(int i=0;iprintf("%d\n",level[i]);

return

0;}

樹狀陣列 poj2352 Stars

stars 題目 題意 在乙個二維陣列中統計某個等級星星的個數,星星的等級為不比此星星高且不在它右邊範圍內的星星個數。題解 因為輸入的資料已經排序,只要一邊接收輸入一邊計算等級即可。include includeusing namespace std int a 15005 c 32010 defi...

poj 2352 Stars(樹狀陣列)

題意 依次給出n個星星的座標 y座標以非遞減的順序輸入 對於每個星星,她的等級等於她左下方的星星的個數和 包括邊界上的星星 要求輸出等級0到等級n 1的星星的個數。0 x,y,32000,1 n 15000 設x i 表示橫座標為i的星星有多少顆,那麼對於乙個單一詢問 星星 k,y 的等級是多少?要...

poj 2352 Stars 樹狀陣列

我的第一道樹狀陣列哇咔咔 大一的時候怎麼都看不懂,也許我當時太不用心了吧。題意 給一些點的座標,每個點的level是看比它高度低且不在它右邊的點的個數。演算法 由於此題座標本來就是按y值從小到大,x值從小到大排列的。所以樹狀陣列中存座標為x的點的個數。每次讀入只要找1 x的sum,然後更新數量 1即...