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; }