HDU 1541 Stars(二维偏序)

题意:
给你平面上n个点对,f(i)表示满足 x j ≤ x i x_j≤x_i xjxi y j ≤ y i y_j≤y_i yjyi的j的数量,对于 d∈[0,n],求满足 f(i)=d 的数量


题解:
直接对于x轴排个序,那么f(i)就是在排序后的数组中找1~i-1中有多少元素满足 y j ≤ y i y_j≤y_i yjyi,直接树状数组即可

时间复杂度O(nlogn)


AC代码:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#include<ext/rope>
using namespace std;
using namespace __gnu_cxx;
typedef long long LL;
const int MAXN = 1e5+10;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
int bit[MAXN],ans[MAXN],n;
struct node{ int x,y; }a[MAXN];
inline bool cmp(node x,node y){ if(x.x!=y.x) return x.x<y.x; return x.y<y.y; }
namespace BIT{
	inline int lowbit(int x){ return x&-x; }
	inline void add(int x,int val){ for(int i=x;i<=1e5;i+=lowbit(i)) bit[i]+=val; }
	inline int query(int x,int res=0){ for(int i=x;i;i-=lowbit(i)) res+=bit[i]; return res; }
}
using namespace BIT;
signed main(){
#ifndef ONLINE_JUDGE
    freopen("C:\\Users\\Administrator\\Desktop\\in.txt","r",stdin);
#endif // ONLINE_JUDGE
    int n; while(~scanf("%d",&n)){
        for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
        sort(a+1,a+n+1,cmp);
        for(int i=1;i<=n;i++){
            int idx=query(a[i].y+1); ans[idx]++;
            add(a[i].y+1,1);
        }
        for(int i=0;i<n;i++) printf("%d\n",ans[i]);
        for(int i=0;i<n;i++) ans[i]=0; memset(bit,0,sizeof(bit));
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值