数星星 contest 树状数组练习 T2

本文探讨了一种使用二分搜索树解决星星坐标问题的方法,通过统计星星的分布情况,实现了对不同级别星星数量的有效计算。文章详细介绍了算法的设计思路、实现过程及代码示例。

Description

天空中有一些星星,这些星星都在不同的位置,每个星星都有个坐标,如果一个星星的左下方(包括正左和正下)有k颗星星,就说这颗星星是k级的。


给定星星的位置,输出各级星星的数目。


Input

第一行,一个整数N,表示星星的数目。接下来N行,每行两个整数x,y,表示一个星星的坐标,输入数据保证不会有星星重叠。

Output

N行,每行一个整数,分别表示0,1,2,3...N-1级星星的数目。

Hint

1<=N<=15000 0<=x,y<=32000。

Solution

这道题最开先真的难住我了(有什么难不住你的靠。),然后其实这个y还没什么用(。在加入的过程中就依次统计sum和修改后面的sum。用一个数组记录就行了。(真的很难啊靠。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define maxn 500005
#define lowbit(x) (x&-x)
#define int long long
using namespace std;
int c[maxn],cntx[maxn],cnty[maxn],gradee[maxn];
int n,x,y,maxy;
void doadd(int x,int d){
    while(x<=maxn){
        c[x]+=d;
        x+=lowbit(x);
    }
}
int dofinD(int x){
    int ans=0;
    while(x>0){
        ans+=c[x];
        x-=lowbit(x);
    }
    return ans;
}
signed main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld%lld",&x,&y);
        int t=dofinD(x);
        gradee[t]++;
        doadd(x,1);
    }
    for(int i=0;i<n;i++){
        printf("%lld\n",gradee[i]);
    }
    return 0;
}

转载于:https://www.cnblogs.com/virtual-north-Illya/p/10045439.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值