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;
}