最小覆盖(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. 卸载oracle 11g数据库

    完全卸载oracle11g步骤:1. 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务.2. 开始->程序->oracle - OraHome ...

  2. Servlet工作原理分析

    最近在看<Java Web技术内幕>的Servlet工作原理,有点深奥和难以理解,于是乎,想通过一个简单的Demo将书上的思路理一遍,对Servlet有个更透彻更深的了解. Servlet ...

  3. python基础教程(七)

    本章介绍如何将语句组织成函数,这样,可以告诉计算机如何做事. 下面编写一小段代码计算婓波那契数列(前两个数的和是第三个数)   fibs = [0,1] # 定义一个列表,初始内容是0,1 for i ...

  4. myeclipse eclipse创建maven web项目时 index.jsp报错

    第一种办法 解决办法: ---------------------------------------------------------------------------------------- ...

  5. 编写JsonResult封装JSON返回值(模板参阅)

    编写JsonResult封装JSON返回值 package cn.tedu.note.util; import java.io.Serializable; import cn.tedu.note.se ...

  6. HTTP协议知多少-关于http1.x、http2、SPDY的相关知识

    作为网站开发的基础协议,我们知道浏览器上都有输出http这四个字母,这意味着什么呢? 这就是最基础的HTTP协议. 逐浪君今天为各位大人准备了一些HTTP技术的知识,来和大家分享. 以下图为例: 这一 ...

  7. ios 初体验< UISegmentedControl 分段控件>

     小知识:  数组快速创建 @[@"",@"",@"",@"".......],字典快速创建方法:@{@"&q ...

  8. 对于c语言存储分配程序(malloc函数)实现的理解

    内容主要出自<The C Programming Language>一书,不得不说这是一本程序员必读的书,我大二读了前面几章就扔到一边了,直到最近才又拿起来再读,找不到言语来形容我现在后悔 ...

  9. 九度OJ 1014 排名

    #include <iostream> #include <string.h> #include <sstream> #include <math.h> ...

  10. SNS团队Beta阶段第三次站立会议(2017.05.24)

    1.立会照片 2.每个人的工作 成员 今天已完成的工作 明天计划完成的工作 罗于婕 辅助完善生词本 辅助完成生词本功能 龚晓婷 辅助开发历史记录功能 辅助完善历史记录功能 林仕庄 开发历史记录功能 完 ...