• 二维偏序


    • 题意: 每个物品有两个参数(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
    ",ans);
        return 0;
    }
    
    

    题目

  • 相关阅读:
    input 蓝边
    4.【ac自动机】模式串匹配
    3.【二叉树】最近公共祖先
    2.【动态规划】最长回文子串
    1. 【线段树】
    DbUtil
    oauth2
    cas
    Spring-security-web
    JSON Web Tokens
  • 原文地址:https://www.cnblogs.com/xxrlz/p/11644895.html
Copyright © 2020-2023  润新知