题意:1e9*1e9的棋盘, 左下角有一个棋子,可以横向或者纵向移动若干格.
n个vertical障碍y,表示不能从第y列移动到第y+1列.
m个horizonal障碍(y1,y2,x) 表示(x,y)不能移动到(x+1,y) [y1<=y<=y2].
0<=n,m<=2e5.问最少删除多少个障碍,使得棋子能走到第1e9行.
首先假如删除了某个vertical障碍y, 则不会再存在vertical障碍y1(y1<y) 否则删除y没有意义,因为永远不能跨过y1
枚举删除到第j个vertical障碍y.那么在每行的[1,y]内可以任意的左右移动,若不存在horizonal障碍[1,y2(y2>=y),r]显然可以从第r行到第r+1行 (存在(r,y')可以往上走)
只需要维护horizonal障碍中以1开头的,每次枚举时二分维护即可.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> ii;
const int N=2e5+5;
int n,m,r,c1,c2;
vector<int> a,b;
int main(){
ios::sync_with_stdio(false);cin.tie(0);
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>c1;
b.push_back(c1);
}
for(int i=0;i<m;i++){
cin>>c1>>c2>>r;
if(c1==1) a.push_back(c2);
}
b.push_back(1e9);//
sort(a.begin(),a.end());
sort(b.begin(),b.end());
int res=1e9,sz=a.size(),sz_b=b.size();
for(int j=0;j<sz_b;j++){
int y=b[j];
int pos=lower_bound(a.begin(),a.end(),y)-a.begin();
res=min(res,j+sz-pos);
}
cout<<res<<'\n';
return 0;
}