(Div 2)C. The Tower is Going Home

http://codeforces.com/contest/1075/problem/C

去除最少的线使得可以从(1,1)到(x,1e9)由于数据比较大,模拟是不可能的。简单分析这是一道思维题,必须要化繁为简

(做这种思维题,就脑糊;我不喜欢思维题,不,我喜欢

竖置的线是贯通的都需要考虑,而横置的线如果不是从1开始,那就不需要考虑(大不了走到最左端穿过

竖置的线(x轴上的坐标)和有效的横置的线(右端点)都从小到大排序

竖置的线将整个棋盘分成了n+1个区域,考虑从每个区域到达(x,1e9)的花费,取最少的即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF=1e9;
const ll inf=LONG_LONG_MIN; 
ll n,m,ans=0;
const ll maxn=1e5+5;
int x[maxn];
int h[maxn];
int main(){
	scanf("%d%d",&n,&m);
	int ans=0;
	for(int i=0;i<n;++i){
		scanf("%d",x+i);
	}
	sort(x,x+n);
	int x1,x2,y1,num=0;
	for(int i=0;i<m;++i){
		scanf("%d%d%d",&x1,&x2,&y1);
		if(x1==1){
			h[num++]=x2;
		}
		if(x2==INF)	ans++;
	}
	sort(h,h+num);
	ans+=n;//走到最最右端再向上的情况
	int i=0,j=0,cnt=num;
	while(i<n){
		while(j<num&&h[j]<x[i]){
			cnt--;
			j++;
		}
		ans=min(ans,cnt+i); 
		if(ans==0)	break;
		++i;
	}
	cout<<ans<<endl;
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值