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;
} 
京公网安备 11010502036488号