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. 数星星(二维偏序问题+树状数组)的主要内容,如果未能解决你的问题,请参考以下文章

CF1221F Choose a Square(二维偏序)

CF1321-World of Darkraft: Battle for Azathoth (线段树+二维偏序)

专题偏序,扫描线

Codeforces Round #625 Div1 C,二维偏序,排序+线段树

[qbzt寒假]线段树和树状数组

#日常吐槽