題目在此:傳送門
題意:在乙個座標軸上,有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 的等級是多少?要...