學(xué)樹(shù)狀數(shù)組的話,可以看
英文的和
中文的(中文的很多啊,可以自己搜,只不過(guò)我覺(jué)得這篇比較好)
后來(lái)看到有些
blog(這個(gè)鏈接以前弄錯(cuò)了,在此表示不好意思)寫到2352是入門題。
表示我一開(kāi)始不會(huì)寫,后來(lái)是看了人家的思路才寫出來(lái)的-_-.
用樹(shù)狀數(shù)組,不用管y坐標(biāo)(因?yàn)橐呀?jīng)是升序,后邊的星星不影響前邊星星的等級(jí)),用level(n)來(lái)統(tǒng)計(jì)x坐標(biāo)為n以前的星星個(gè)數(shù),但是千萬(wàn)注意樹(shù)狀數(shù)組需要數(shù)組以1為首項(xiàng),由于坐標(biāo)有0,所以每次需要給x坐標(biāo)+1(因?yàn)槌霈F(xiàn)0會(huì)死循環(huán))
還有一點(diǎn)就是那篇英文的介紹里面有點(diǎn)小錯(cuò)誤,就是scale的第一個(gè)函數(shù)中,調(diào)用update時(shí)參數(shù)傳反了
#include <iostream>
using namespace std;
int tree[32006];
int level[32006];
int n;
void update(int idx)//更新,因?yàn)樗械亩贾粫?huì)增加1,所以只用傳一個(gè)參數(shù)就行了
{
while(idx <= 32006)
{
tree[idx]++;
idx += (idx & (-idx));
}
}
int read(int idx)
{//求一段數(shù)組的和
int sum = 0;
while(idx > 0)
{
sum += tree[idx];
idx -= (idx & (-idx));
}
return sum;
}
int main(void)
{
freopen("2352.in","r",stdin);
freopen("2352.out","w",stdout);
int x,y;
scanf("%d",&n);
memset(tree,0,sizeof(tree));
memset(level,0,sizeof(level));
for(int i = 0;i < n;i++)
{
scanf("%d%d",&x,&y);
x++;//防止出現(xiàn)下標(biāo)0
level[read(x)]++;//先得到改點(diǎn)的level值
update(x);//更新以x為下標(biāo)的tree數(shù)組值
}
for(int i = 0;i < n;i++)
{
printf("%d\n",level[i]);//不用減1 因?yàn)槲沂窍惹笤诟碌?/span>
}
return 0;
}