CF Lyft18C. The Tower Is Going Home 【思维】

题意: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;
}

  

 

posted @ 2018-11-26 10:27  Nanamiii  阅读(109)  评论(0)    收藏  举报