前面用树状数组写了下,这次又线段树写。
发现线段树如果学的好的话,那么这题应该代码量不大,不然代码量比较大,至少比树状数组大。
这题要说的就是线段树里存的信息了,我存的是[left,right]里面所含的星星数

CODE
1
/**//*
2
ID:Klion
3
PRO:POJ_2352
4
LANG:C++
5
*/
6
#include <iostream>
7
using namespace std;
8
int level[15002];
9
int tree[32000*4];//线段树内存要求基本是n*4
10
int find(int i,int x,int left = 0,int right = 32000)
11

{
12
tree[i]++;
13
if(x == right)
14
return tree[i]-1;//减去自己
15
int mid = (left + right) >> 1;
16
if(x <= mid)
17
return find(i<<1,x,left,mid);
18
else
19
return tree[i<<1]+find((i<<1) + 1,x,mid+1,right);
20
}
21
int main(void)
22

{
23
int n;
24
int x,y;
25
scanf("%d",&n);
26
for(int i = 0;i < n;i++)
27
{
28
scanf("%d%d",&x,&y);
29
level[find(1,x)]++;//查询,插入一并操作
30
}
31
for(int i = 0;i < n;i++)
32
printf("%d\n",level[i]);
33
return 0;
34
}
35