码迷,mamicode.com
首页 > 其他好文 > 详细

二维偏序

时间:2019-10-10 00:05:22      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:树状   数组   upd   return   using   cstring   turn   str   node   

  • 题意: 每个物品有两个参数(x,y),问\(x_i > x_j 且 y_i > y_j\)成立的\(j\)有多少个.
  • 思路: 二维偏序,先对x进行排序,对y离散化,从后到前循环,对点i,树状数组求当前有多少个y比y_i小的,若小于n-i,则说明后面存在y比他大的,且后面的一定x比他大,所以当前这个点能贡献一次答案,然后再在y_i添加一次树状数组
#include<cstring>
#include<cstdio>
#include<queue>
#include<iostream>
#include<algorithm>
#define ll long long
#define pii pair<int,int>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 1e5+10;
struct node{
    int x,y;
}a[N];
int n,w[N];
struct bit{
    int a[N];
    void update(int x,int pos){
        for(int i=pos;i<=n;i+=i&(-i))
            a[i] += x;
    }
    int sum(int pos){
        int res = 0;
        for(int i=pos;i;i-=i&(-i))
            res += a[i];
        return res;
    }
    int query(int l,int r){
        return sum(r) - sum(l-1);
    }
}bt;
int cmp(node a,node b){
    return a.x < b.x;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i)   scanf("%d%d",&a[i].x,&a[i].y),w[i] = a[i].y;
    sort(w+1,w+1+n);
    int t = unique(w+1,w+1+n)-w-1;
    for(int i=1;i<=n;++i){
        a[i].y = lower_bound(w+1,w+t+1,a[i].y) - w;
    }
    sort(a+1,a+1+n,cmp);
    int ans = 0;
    for(int i=n;i>=1;--i){
        int d = bt.sum(a[i].y);
        if(n-i-d!=0)    ans++;
        bt.update(1,a[i].y);
    }
    printf("%d\n",ans);
    return 0;
}

题目

二维偏序

标签:树状   数组   upd   return   using   cstring   turn   str   node   

原文地址:https://www.cnblogs.com/xxrlz/p/11644895.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!