问题描述
时间限制: 1Sec 内存限制: 128MB
输入
输出
样例输入
样例输出
数据范围描述
常规解法
#include <stdio.h>
int main(void) {
int n;
scanf("%d",&n);
int loc[n][2];
for(int i=0;i<n;i++){
scanf("%d %d",&loc[i][0],&loc[i][1]);
}
int count[n];
for(int i=0;i<n;i++){
int temp0 = loc[i][0];
int temp1 = loc[i][1];
for(int j=0;j<n;j++){
if(i == j){
continue;
}else if(((temp0 >= loc[j][0]) && (temp1 >= loc[j][1]))
||((temp0 == loc[j][0]) && (temp1 >= loc[j][1]))
|| (((temp0 >= loc[j][0]) && (temp1 == loc[j][1])))){
count[i] += 1;
}
}
// printf("%d\n",count[i]);
}
int starC[n];
int k=0;
while(k<n){
for(int i=0;i<n;i++){
if(count[i] == k){
starC[k] +=1;
}
}
k++;
}
for(int i=0;i<n;i++){
printf("%d\n",starC[i]);
}
return 0;
}
遇到的问题:此解法时间复杂度为O(n^2),会超时。
树状数组解法
#include <stdio.h>
const int N = 100010;
int tree[100010];
int lowbit(int x){
return x & (-x);
}
void update(int x,int k){
while(x<N){
tree[x] += k;
x += lowbit(x);
}
}
int getSum(int x){
int res = 0;
while(x>0){
res += tree[x];
x -= lowbit(x);
}
return res;
}
int main(void) {
int n;
scanf("%d",&n);
int x,y;
//记录各个级别星星左下角星星的个数
int ans[100010];
for(int i=0;i<n;i++){
scanf("%d %d",&x,&y);
x += 1;
int smallStarN = getSum(x);
ans[smallStarN] +=1;
update(x,1);
}
for(int i=0;i<n;i++){
printf("%d\n",ans[i]);
}
return 0;
}
此解法的时间复杂度为O(nlogn)