题目有图,不附了,好麻烦……
http://codevs.cn/problem/1066/
我的想法是:对于第一排每个点都做一遍dfs,获得它能控制的区间(回溯时更新)。
可以证得,如果它控制的区间不是一个(也就是中间有中断),那么必定不可全部覆盖。
每个点一遍dfs,时间复杂度太高,还有可能爆栈,记忆化一下就好了,这样的话时间复杂度也可以承受,这玩意我写疵了…调了好久…早知道就不做死打dfs了……bfs其实蛮好写的……
dfs可以设maps[i][j]保存两个值: < i , j > 这个点所控制的区间的左右端点,然后如果搜到了已经搜过的点,就直接利用maps更新即可。
接下来是线段覆盖:给你一堆线段,去掉尽量多的线段,使得剩下的线段能覆盖整个区间。
然后我看了看黄学长标程(智商低…),大概是这样:
先按左端点升序为第一关键字,右端点升序为第二关键字排序。
设两个变量:now和to,表示当前最大扩展到第now位,下一个区间最大可以扩展到第to位。若now+1>=l[i].l
(表示当前区间可以和now接上,中间不留空隙),则更新to,直到不满足上面那个关系,即可选最后更新to的区间(其实我们并不关心到底是哪个区间)。
最后别忘了,如果now到不了最右端,则ans++;
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int INF=