Laptop
思路:
可是,有一些笔记本是被另外一些“完虐”的,也就是内存和速度都不高于另外某一个笔记本,现在FST想统计一下有多少笔记本被“完虐”。
把文件简化就是,xi < xj && yi < yj的数量,考虑暴力O(n^2),肯定超时,所以我们考虑用数据结构优化一下,我们可以先对第一维x排序,然后只要找满足条件的第二维y就行了,我们只需要用线段树维护一下区间最大值就行了,每个每台笔记本i,然后询问区间[i,n]是否存在比它更大的第二维,如果存在cnt++,最后输出答案即可。
代码:

#include<bits/stdc++.h>
using namespace std;

#define fi first
#define se second
typedef long long int ll;
typedef pair<ll,ll> pll;
typedef pair<int ,int> pii;
const int maxn = 1e5 + 10;
pii a[maxn];
bool cmp(pii a,pii b){
    return a.fi < b.fi;
}
struct seg{
    int l,r;
    ll v,m;
    seg(){}
    seg(int a,int b):l(a),r(b){}
}tree[maxn <<  2];
int tot = 1;
void build(int rt,int l,int r){
    tree[rt] = {l,r};
    if(l == r){
        tree[rt].m = tree[rt].v = a[tot++].se;
        return ;
    }
    int mid = l + r >> 1;
    build(rt << 1,l,mid);
    build((rt << 1) + 1,mid + 1,r);
    tree[rt].m = max(tree[rt << 1].m,tree[(rt << 1) + 1].m);
}
int query(int rt,int l,int r){
    if(tree[rt].l >= l && tree[rt].r <= r){
        return tree[rt].m;
    }
    int mid = tree[rt].l + tree[rt].r >> 1;
    if(r <= mid) return query(rt << 1,l,r);
    else if(l > mid) return query((rt << 1) + 1,l,r);
    else return max(query(rt << 1,l,r),query((rt << 1) + 1,l,r));
}
void solved(){
    int n;cin>>n;
    for(int i = 1; i <= n; i++){
        cin>>a[i].fi>>a[i].se;
    }
    sort(a + 1,a + 1 + n,cmp);
    build(1,1,n);
    int ans = 0;
    for(int i = 1; i < n; i++){
        if(a[i].se < query(1,i + 1,n))ans++;
    }
    cout<<ans<<endl;
}
int main(){
    solved();
    return 0;
}