最小覆盖(cover)、、线段树

【题目描述】

给定 N 个区间[Li,Ri],需要你按照顺序选出一个区间序列使得[1,M]完全被覆盖。并且在选出来的序列中,某个区间[a,b]之前必须保证[1,a]都被已经选中的区间覆盖(即没有“断开”的地方)。求出最少需要选多少区间

【输入文件】

第一行两个整数 M 和 N。

以下 N 行每行两个正整数 Li,Ri 表示这个区间。

【输出文件】

一个整数,表示最少的区间数。

【样例输入】

40 6

20 30

1 10

10 20

20 30

15 25

30 40

【样例输出】

4

【样例解释】

[1,10]-[10,20]-[20,30]-[30,40]

【数据规模】

对于 100%的数据 1<=N<=500000, 0<=M<=50000

先不看数据,知道这是一道DP题。

F[i]表示填满1~i区间最少需要几个区间。

因为数据范围大,所以用线段树维护。

code

#include <cstdio>
#include <cctype>
#include <algorithm>
#define C c = tc ( )
using namespace std;
inline char tc(){
static char fl[],*A,*B;
return A==B&&(B=(A=fl)+fread(fl,,,stdin),A==B)?EOF:*A++;
}
inline int read(){
char c;int x=,y=;
while(!isdigit(C)&&c!='-');c=='-'?y=-:x=c-'';
while(isdigit(C))x=x*+c-'';
return x*y;
}
struct node{
int x,y;
}a[];
int m,n,seg[*+],add[*+];
void up(int node){seg[node]=min(seg[node<<],seg[(node<<)+]);}
void down(int node){
if(add[node]!=){
add[node*]=min(add[node*],add[node]);
add[node*+]=min(add[node*+],add[node]);
seg[node*]=min(seg[node*],add[node]);
seg[node*+]=min(seg[node*+],add[node]);
add[node]=;
}
return ;
}
int query(int node,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r)return seg[node];
int mid=(l+r)>>;
down(node);
int ans=;
if(ql<=mid)ans=min(ans,query(node*,l,mid,ql,qr));
if(qr>mid) ans=min(ans,query(node*+,mid+,r,ql,qr));
return ans;
}
void change(int node,int l,int r,int cl,int cr,int v){
if(cl<=l&&cr>=r){
seg[node]=min(seg[node],v);
add[node]=min(add[node],v);
return ;
}
int mid=(l+r)>>;
down(node);
if(cl<=mid)change(node*,l,mid,cl,cr,v);
if(cr>mid) change(node*+,mid+,r,cl,cr,v);
up(node);
}
int main(){
freopen("cover.in","r",stdin);
freopen("cover.out","w",stdout);
m=read(),n=read();
for(int i=;i<=n;i++)a[i].x=read(),a[i].y=read();
for(int i=;i<=m*;i++)seg[i]=add[i]=;
change(,,m,,,);
for(int i=;i<=n;i++){
int p=query(,,m,a[i].x,a[i].y);
if(p==)continue;
change(,,m,a[i].x,a[i].y,p+);
}
printf("%d",query(,,m,m,m));
fclose(stdin),fclose(stdout);
return ;
}

膜拜度神

最小覆盖_KEY的更多相关文章

  1. POJ2185Milking Grid(最小覆盖子串 + 二维KMP)

    题意: 一个r*c的矩形,求一个子矩形通过平移复制能覆盖整个矩形 关于一个字符串的最小覆盖子串可以看这里http://blog.csdn.net/fjsd155/article/details/686 ...

  2. UVA 11419SAM I AM(输出 最小覆盖点 )

    参考博客:如何找取 最小覆盖点集合 题意:R*C大小的网格,网格上面放了一些目标.可以再网格外发射子弹,子弹会沿着垂直或者水平方向飞行,并且打掉飞行路径上的所有目标,计算最小多少子弹,各从哪些位置发射 ...

  3. 二维KMP - 求字符矩阵的最小覆盖矩阵 - poj 2185

    Milking Grid Problem's Link:http://poj.org/problem?id=2185 Mean: 给你一个n*m的字符矩阵,让你求这个字符矩阵的最小覆盖矩阵,输出这个最 ...

  4. KMP算法 - 求最小覆盖子串

    KMP与最小覆盖子串 最小覆盖子串:对于某个字符串s,它的最小覆盖子串指的是长度最小的子串p,p满足通过自身的多次连接得到q,最后能够使s成为q的子串. 比如: 对于s="abcab&quo ...

  5. hdu---(1054)Strategic Game(最小覆盖边)

    Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  6. hdu------1281 棋盘游戏(最小覆盖点)

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. Machine Schedule(最小覆盖)

    其实也是个最小覆盖问题 关于最小覆盖http://blog.csdn.net/u014665013/article/details/49870029 Description As we all kno ...

  8. Asteroids (最小覆盖)

    题目很简单,但是需要推到出二分图最大匹配 = 最小覆盖 最小覆盖:证明过程http://blog.sina.com.cn/s/blog_51cea4040100h152.html Descriptio ...

  9. zoj 1450 Minimal Circle 最小覆盖圆

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=450 You are to write a program to fi ...

随机推荐

  1. 【Weblogic】在linux创建domain过慢的解决方法

    修改Linux上Weblogic使用的jdk $JAVA_HOME/jre/lib/security/java.security 文件 将 securerandom.source=file:/dev/ ...

  2. sublime text3开发python并设置快捷键

    Package Control 安装方法 1.通过快捷键 ctrl+` 或者 View > Show Console 打开控制台,然后粘贴相应的 Python 安装代码: 2.Sublime T ...

  3. python基础教程(十)

    魔法方法.属性 ------------------------ 准备工作 为了确保类是新型类,应该把 _metaclass_=type 入到你的模块的最开始. class NewType(Objec ...

  4. java8新特性,使用流遍历集合

    在这篇“Java 8新特性教程”系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章“遍历.过滤.处理集合及使用Lambda ...

  5. tomcat设置文件编码

    tomcat修改bin文件夹下面的catalina.bat文件可以解决乱码在文件中加上JAVA_OPTS="-server -Xms128M -Xmx4096M -XX:PermSize=5 ...

  6. 探索 ConcurrentHashMap 高并发性的实现机制

    很不错的一篇文章,值得一看 http://www.ibm.com/developerworks/cn/java/java-lo-concurrenthashmap/

  7. 规则集Set与线性表List性能分析

    前言 本章节将通过实验,测试规则集与线性表的性能.那么如何进行实验呢?针对不同的集合都进行指定数量元素的添加和删除操作,计算耗费时间进行分析. 那么,前两个章节呢,我们分别讲述了什么时候使用Set以及 ...

  8. POJ 1236 tarjan

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19613   Accepted: 77 ...

  9. 我的hibernate学习记录(二)

    通过上一篇文章我的hibernate学习记录(一)基本上的入门了hibernate,但是,里面还有还多东西是通过迷迷糊糊的记忆,或者说copy直接弄进去的,所以这篇文章就需要对上篇的一些文件.对象进行 ...

  10. tkinter第一章1

    tk1 ------------------------------------------------------------------------------------------ impor ...