标签:name font describe space bsp 题意 integer 复杂度 有序
英文原题
天文学家把天上的每颗星星都画在一个平面上,并给定每颗的坐标。同时把星星左下方(包括横坐标或者纵坐标一样的)的星星数目定义为该星星的等级。天文学家想知道星星等级的分布。
例如上图中,5号星星的等级为3(左下方的星星为1,2,4),2号与4号星星等级为1。上图中等级为0的星星有1颗,等级为1的星星有2颗,等级为2的星星有1颗,等级为3的星星有1颗。
请写一个程序计算屏幕上每一个等级的星星数。
仔细审题之后,发现是树状数组,因为输入的xy的值是有序的,所以只需要建立c[x]表示横坐标小于等于x的符合要求的点有几个,运用到树状数组的基础知识,统计出即可。
下面给出代码
1 //树状数组基本框架的搭建(维护和查询都是O(lgn)的复杂度) 2 #include<iostream> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<cstring> 6 #include<string> 7 using namespace std; 8 int n,a,b; 9 int c[40000],ans[40000];//注意数组的大小 10 11 int lowbit(int k) 12 { 13 return k&(-k); 14 15 } 16 int add(int k,int num) 17 { 18 while(k<=32010)//此处的32010应为n的最大值+2 19 { 20 c[k]+=num; 21 k+=lowbit(k); 22 } 23 } 24 int sum(int k) 25 { 26 int Sum=0; 27 while(k>0) 28 { 29 Sum+=c[k]; 30 k-=lowbit(k); 31 } 32 return Sum; 33 } 34 35 36 int main() 37 { 38 cin>>n; 39 for(int i=1;i<=n;i++) 40 { 41 cin>>a>>b; 42 a=a+1;//树状数组的下标需要从1开始,而数据从0开始,故此+1; 43 ans[sum(a)]++; 44 add(a,1); 45 } 46 for(int i=0;i<n;i++) 47 cout<<ans[i]<<endl; 48 return 0; 49 }
标签:name font describe space bsp 题意 integer 复杂度 有序
原文地址:http://www.cnblogs.com/foreverpiano/p/6881968.html