数星星

#include<iostream>
using namespace std;
const int N=100010;
int a[N],tr[N];
int lowbit(int x)
{
    return x&-x;
}
void add(int x)
{
    for(int i=x;i<=N;i+=lowbit(i))tr[i]++;//值得注意的是,树状数组的更新一定要更新到N
}
int query(int x)
{
    int res=0;
   for(int i=x;i;i-=lowbit(i))
   {
       res+=tr[i];
   }
   return res;
}
int main()
{
    int  t;
    cin>>t;
    for(int i=1;i<=t;i++)
    {
        int x,y;
        cin>>x>>y;
        x++;//x的最小值是0,而树状数组的最小下标为1,所以整体往后移一个。
        add(x);
        a[query(x)]++;
    }
    for(int i=1;i<=t;i++)
    {
        cout<<a[i]<<endl;
    }
    return 0;
}
这题的主要考查的是树状数组的应用,因为坐标是按 y 坐标增序给出,y 坐标相同的按 x 坐标增序给出。
所以只要求当前给出的坐标中所有横坐标小于等于该坐标的个数,自然能够想到使用前缀和,因为y坐标
是递增的,当前y坐标一定是最大的,所以求当前x的前缀和即可。
全部评论

相关推荐

Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
美丽的查理斯不讲武德:包kpi的啊,感觉虾皮一点hc都没有
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务