AcWing 1265. 数星星(二维偏序问题+树状数组)
Posted MangataTS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 1265. 数星星(二维偏序问题+树状数组)相关的知识,希望对你有一定的参考价值。
题目链接
https://www.acwing.com/problem/content/description/1267/
思路
二位偏序问题,我们已经直到了这个坐标轴是按照先 y
升序再按照 x
升序来输入的,那么对于这道题来说,因为已经确保了所有可能小于当前点的点都在当前点前面出现,我们只需要使用树状数组不断动态求前缀和即可。树状数组的下标需要从1开始,所以在处理的时候还要稍微注意一下(加一操作即可)。
那么我们求解的这个前缀和就是x轴小于等于当前的 loc_x
的星星数量(不包含当前这个星星)
代码
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
#define ll long long
const int N = 2e5+10;
ll n,m,ans[N];
pair<ll,ll> a[N];
struct BinaryTree
ll tree[N<<2];
ll lowbit(ll x)
return -x & x;
void update(ll loc,ll k)
for(;loc < N;loc += lowbit(loc)) tree[loc] += k;
ll query(ll loc)
ll ans = 0LL;
for(;loc; loc -= lowbit(loc)) ans += tree[loc];
return ans;
void build()
cin>>n;
for(int i = 1;i <= n; ++i)
cin>>a[i].second>>a[i].first;
sort(a+1,a+1+n);
BT;
int main()
BT.build();
for(int i = 1;i <= n; ++i)
ll x = a[i].second,y = a[i].first;
ans[BT.query(x + 1)]++;
BT.update(x + 1,1);
for(int i = 0;i < n; ++i)
cout<<ans[i]<<"\\n";
以上是关于AcWing 1265. 数星星(二维偏序问题+树状数组)的主要内容,如果未能解决你的问题,请参考以下文章
CF1321-World of Darkraft: Battle for Azathoth (线段树+二维偏序)