题目大意:给你很多条线段,开头结尾是$[l,r]$,让你覆盖整个区间$[1,T]$,求最少的线段数

题目传送门

线段树优化$DP$裸题..

先去掉所有能被其他线段包含的线段,这种线段一定不在最优解里

排序,让所有线段构成左右端点位置都递增的排列

定义$f[i]$表示第$i$条线段,覆盖到第$i$条线段右端点时,需要的最少的线段数

$f[i]=min(f[j]+1)\;(j<i,r[j]>=l[i])$

朴素是$n^2$转移的

开一棵最小值线段树,记录从$1$覆盖到位置$x$的最少线段数

每次求$f[i]$就是在线段树里区间查询。然后在$r[i]$位置更新即可

 #include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 25010
#define M1 1000010
#define ll long long
#define dd double
#define inf 233333333
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
} struct SEG{
int mi[M1<<];
void pushup(int rt){ mi[rt]=min(mi[rt<<],mi[rt<<|]); }
void build(int l,int r,int rt)
{
mi[rt]=inf; if(l==r) return;
int mid=(l+r)>>;
build(l,mid,rt<<);
build(mid+,r,rt<<|);
}
void update(int x,int l,int r,int rt,int w)
{
if(l==r){ mi[rt]=w; return; }
int mid=(l+r)>>;
if(x<=mid) update(x,l,mid,rt<<,w);
else update(x,mid+,r,rt<<|,w);
pushup(rt);
}
int query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R) return mi[rt];
int mid=(l+r)>>,ans=inf;
if(L<=mid) ans=min(ans,query(L,R,l,mid,rt<<));
if(R>mid) ans=min(ans,query(L,R,mid+,r,rt<<|));
return ans;
}
}s; struct node{int l,r;}a[N1],tmp[N1];
int cmp(node s1,node s2){ if(s1.l!=s2.l) return s1.l<s2.l; return s1.r>s2.r; }
int n,m,nn;
int f[M1]; int main()
{
scanf("%d%d",&n,&m);
int i,ma,ans=inf;
for(i=;i<=n;i++) tmp[i].l=gint(),tmp[i].r=gint();
sort(tmp+,tmp+n+,cmp);
for(i=,ma=;i<=n;i++)
{
if(tmp[i].l>ma+){ puts("-1"); return ; }
if(tmp[i].r>ma) ma=tmp[i].r,a[++nn]=tmp[i];
}
s.build(,m,);
f[]=; s.update(a[].r,,m,,);
if(a[].r==m){ puts(""); return ; }
for(i=,ma=a[].r;i<=nn;i++)
{
f[i]=s.query(max(,a[i].l-),ma,,m,)+;
s.update(a[i].r,,m,,f[i]);
ma=a[i].r;
if(a[i].r==m) ans=f[i];
}
if(ans==inf) puts("-1");
else printf("%d\n",ans);
return ;
}

最新文章

  1. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
  2. JavaScript JsTree实例
  3. download ncRNA sequences form NCBI
  4. 30、准确计算CoreText高度的方法
  5. [tp3.2.1]数据模型 - 简单的模型连接
  6. 李洪强iOS开发之【Objective-C】07-自定义构造方法和description方法
  7. Ubuntu+Eclipse+ADT+Genymotion+VirtualBox开发环境搭建
  8. esclipse连接mysql数据库
  9. (译)通过 HTML、JS 和 Electron 创建你的第一个桌面应用
  10. lucene6+HanLP中文分词
  11. Chapter 2 User Authentication, Authorization, and Security(10):创建包含数据库
  12. 从javascript发展说到vue
  13. Tomcat日志设定
  14. P1316 丢瓶盖(二分+贪心)
  15. Codeforces Round #471 (Div. 2) F. Heaps(dp)
  16. 20165223 学习基础和C语言基础调查
  17. django(八)之数据库表的一对多,多对多表-增删改查
  18. opencv wlsfilter depth refinement demo
  19. jquery chrome中取select 的值一就返回了
  20. 宝岛探险,DFS&amp;BFS

热门文章

  1. 项目结构、包、编译为exe!
  2. POJ 3080 Blue Jeans (后缀数组)
  3. PowerDesigner里面将表中name列值拷贝到comment列
  4. ArcGIS Python实现Modis NDVI批量化月最大合成
  5. 查找python项目依赖并生成requirements.txt——pipreqs 真是很好用啊
  6. redis配置文件参数详解
  7. js原生_获取url键值对
  8. (转)Oracle分区表和索引的创建与管理
  9. SpringMVC(三)@PathVariable
  10. C# 重命名文件方法