树状数组——数星星 Stars

问题描述

时间限制: 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)

树状数组结构

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值