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

本文介绍了一种算法,旨在解决一个1e9*1e9大小的棋盘上,棋子从左下角出发,通过删除最少数量的垂直和水平障碍,使棋子能够到达第1e9行的问题。讨论了障碍的删除策略,并提供了一个具体的C++实现。

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

  

 

转载于:https://www.cnblogs.com/HIKARI1149/p/10018923.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值