HDU 1541 Stars(二维偏序)

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


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

时间复杂度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;
}

发布了152 篇原创文章 · 获赞 1 · 访问量 2723

猜你喜欢

转载自blog.csdn.net/qq_43544481/article/details/103733273