前面用树状数组写了下,这次又线段树写。
发现线段树如果学的好的话,那么这题应该代码量不大,不然代码量比较大,至少比树状数组大。
这题要说的就是线段树里存的信息了,我存的是[left,right]里面所含的星星数
CODE
1/**//*
2 ID:Klion
3 PRO:POJ_2352
4 LANG:C++
5 */
6#include <iostream>
7using namespace std;
8int level[15002];
9int tree[32000*4];//线段树内存要求基本是n*4
10int 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}
21int 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