poj2352 Stars 線段樹單點更新

2021-08-04 07:35:26 字數 1439 閱讀 9103

題目在此:傳送門

題意:在乙個座標軸上,有n顆星星,每顆星都有等級,等級的範圍為0~n-1,每顆星的等級為它左下角存在的星星(不包括自身,y座標可以相等)的數量,有幾顆星等級就為幾,然後依次輸出等級0~n-1的星的數量;

思路:線段樹,因為是要判斷左下角星星的數量,那麼我們先以y座標公升序排序,如果y座標相同就以x座標公升序排序,這樣就能保證我們判斷乙個星星的等級時,它左下角的所有點都已經放入線段樹中;排序題目已經幫助我們完成,那麼就是線段樹該如何存點。線段樹只用來存每顆星星的x座標,因為y是公升序的關係,我們能保證區間查詢某個星星時所有的點都在該星星下方,這時我們只需要判斷x座標是否比查詢的星星的x座標小就可以了;

附上**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define maxn 15005

#define maxn 32005//座標的最大值

#define inf 1000000007

#define lmid l,m,rt<<1

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

using namespace std;

int tree[maxn<<2];

struct node

s[maxn];

int ans[maxn];//每個等級星星的數量

void pushup(int rt)

void build(int l,int r,int rt)

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

build(lmid);

build(rmid);

pushup(rt);

}void update(int l,int c,int l,int r,int rt)

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

if(l<=m) update(l,c,lmid);

else update(l,c,rmid);

pushup(rt);

}int query(int l,int r,int l,int r,int rt)

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

int res=0;

if(m>=l) res+=query(l,r,lmid);

if(r>m) res+=query(l,r,rmid);

return res;

}int main()

{memset(ans,0,sizeof(ans));

int n;

scanf("%d",&n);

int m=0;

for(int i=0;i

有到題與此題類似,可做練習題傳送門;

poj 2352 Stars 樹狀陣列or線段樹

題目大意 在座標上有n個星星,如果某個星星座標為 x,y 它的左下位置為 x0,y0 x0 x 且y0 y。如果左下位置有a個星星,就表示這個星星屬於level x 按照y遞增,如果y相同則x遞增的順序給出n個星星,求出所有level水平的數量。分析 因為輸入是按照按照y遞增,如果y相同則x遞增的順...

樹狀陣列 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 的等級是多少?要...