去博客园看该题解

题意

  给定n个区间[a,b),都是左闭右开,有m次询问,每次询问你最多可以从n个区间中选出多少[L,R]的子区间,使得他们互不相交。 n,m<=10^5。 区间下标<=10^9。

题解

  这题要用倍增。

  首先,给区间按照左端点编号排个序。

  如果区间A包含了区间B,那么A一定没用,扔了。

  那么剩余的区间[x,y]的x和y一定都是升序的。

  之后,就是对于区间的贪心了:

  找到一个区间[xi,yi]之后,一定是寻找一个xj>yi且xj最小的那个区间[xj,yj],所以设该区间的编号j=next[i];这个只要二分查找一下就可以了。

  那么贪心的时候就是不断的走next,这样就出现了一个O(nm)的算法。

  那么倍增怎么做呢?

  设nxt[i][j]为第i个区间next 2^j 次后的区间编号,那么:

  nxt[i][0]=next[i],nxt[i][j]=nxt[nxt[i][j-1]][j-1

  于是就可以做了。

  不过这里我要提醒一点:C++的变量名如果用了"next",在HDU是无法通过编译的,我因此贡献了8次CE……

代码

#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=+;
int n,m;
int Next[N][];
bool alive[N];
struct Seg{
int x,y;
bool operator < (const Seg &a) const{
if (x==a.x)
return y>a.y;
return x<a.x;
}
}a[N];
void Thrown(){
int n_=,miny=1e9+;
for (int i=n;i>=;i--)
if (a[i].y>=miny)
alive[i]=;
else
alive[i]=,miny=min(miny,a[i].y);
for (int i=;i<=n;i++)
if (alive[i])
a[++n_]=a[i];
n=n_;
}
int findx(int x){
int le=,ri=n,mid,ans=n+;
while (le<=ri){
mid=(le+ri)>>;
if (a[mid].x==x)
return mid;
if (a[mid].x>x)
ri=mid-,ans=mid;
else
le=mid+;
}
return ans;
}
int solve(int L,int R){
int st=findx(L),ans=,k;
if (a[st].y>R)
return ;
for (k=;(<<k)<=n-st;k++);
for (;k>=;k--)
if ((<<k)<=n-st&&a[Next[st][k]].y<=R)
st=Next[st][k],ans+=<<k;
return ans;
}
int main(){
while (~scanf("%d%d",&n,&m)){
memset(Next,,sizeof Next);
for (int i=;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y),a[i].y--;
sort(a+,a+n+);
Thrown();
a[n+].y=1e9+;
a[].y=1e9+;
for (int i=n;i>=;i--){
Next[i][]=findx(a[i].y+);
for (int j=;(<<j)<=n-i;j++)
Next[i][j]=Next[Next[i][j-]][j-];
}
for (int i=,L,R;i<=m;i++){
scanf("%d%d",&L,&R);
printf("%d\n",solve(L,R));
}
}
return ;
}

HDU4343Interval query 倍增的更多相关文章

  1. 刷题总结——Interval query(hdu4343倍增+贪心)

    题目: Problem Description This is a very simple question. There are N intervals in number axis, and M ...

  2. QTREE2 spoj 913. Query on a tree II 经典的倍增思想

    QTREE2 经典的倍增思想 题目: 给出一棵树,求: 1.两点之间距离. 2.从节点x到节点y最短路径上第k个节点的编号. 分析: 第一问的话,随便以一个节点为根,求得其他节点到根的距离,然后对于每 ...

  3. 【HDU 4343】Interval query(倍增)

    BUPT2017 wintertraining(15) #8D 题意 给你x轴上的N个线段,M次查询,每次问你[l,r]区间里最多有多少个不相交的线段.(0<N, M<=100000) 限 ...

  4. [SPOJ913]QTREE2 - Query on a tree II【倍增LCA】

    题目描述 [传送门] 题目大意 给一棵树,有两种操作: 求(u,v)路径的距离. 求以u为起点,v为终点的第k的节点. 分析 比较简单的倍增LCA模板题. 首先对于第一问,我们只需要预处理出根节点到各 ...

  5. SPOJ375 Query on a tree 【倍增,在线】

    题目链接[http://www.spoj.com/problems/QTREE/] 题意:给出一个包含N(N<=10000)节点的无根树,有多次询问,询问的方式有两种1.DIST  a b 求a ...

  6. 【倍增】LCM QUERY

    给一个序列,每次给一个长度l,问长度为l的区间中lcm最小的. 题解:因为ai<60,所以以某个点为左端点的区间的lcm只有最多60种的情况,而且相同的lcm区间的连续的. 所以就想到一个n*6 ...

  7. Query on a tree II 倍增LCA

    You are given a tree (an undirected acyclic connected graph) with N nodes, and edges numbered 1, 2, ...

  8. spoj 913 Query on a tree II (倍增lca)

    Query on a tree II You are given a tree (an undirected acyclic connected graph) with N nodes, and ed ...

  9. HDU 4343 Interval query(贪心 + 倍增)

    题目链接  2012多校5 Problem D 题意  给定$n$个区间,数字范围在$[0, 10^{9}]$之间,保证左端点严格大于右端点. 然后有$m$个询问,每个询问也为一个区间,数字范围在$[ ...

随机推荐

  1. [转载]RabbitMQ消息可靠性分析

    有很多人问过我这么一类问题:RabbitMQ如何确保消息可靠?很多时候,笔者的回答都是:说来话长的事情何来长话短说.的确,要确保消息可靠不只是单单几句就能够叙述明白的,包括Kafka也是如此.可靠并不 ...

  2. Spring initializr使用

    Spring initializr 是Spring 官方提供的一个很好的工具,用来初始化一个Spring boot 的项目. 有两种方式可以使用Spring initializr来创建一个项目: ht ...

  3. Golang 类型转换,断言和显式强制转换

    1 前言 类型转换,可以用断言(只能使用在interface{}类型转换成其它类型)和显式类型强制转换(常规是用于基本类型) 2 代码 //graphql-go func(params graphql ...

  4. Spring通过SchedulerFactoryBean实现调度任务的配置(定时器)

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  5. Python- 索引 B+数 比如书的目录

    1.索引 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题, 在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作, 因此对查询 ...

  6. 31)django-序列化

    目录 1)序列化 2)为什么不用json序列化 3)django序列化QuerySet,ErrorDict数据 一:序列化 序列化是将对象状态转换为可保持或传输的格式的过程 反序列化是指将存储在存储媒 ...

  7. Confluence 6 启用主题评论

    页面或者博客页面中显示的评论以下面 2 种方式显示: 主题模式(Threaded):以继承回复的方式显示页面的评论.每一回复的评论将会在不同评论之间显示,以表示各个评论之间的关系. 平面模式(Flat ...

  8. 如何打包/运行jar包,及生成exe文件

    关于如何打包/运行jar包,以及生成exe文件.之前各种查询.博客,终于搞明白究竟是咋回事.记得还做过笔记的.今天要打包生成exe用的时候,居然忘了咋怎来着.去查看之前的笔记,死活没找到(好像被删掉了 ...

  9. day03 变量 运算符 基本数据类型 输出功能 格式化输出

    变量补充 变量的命名 1变量名的命名的大前提:应该能够反映出变量值所记录的状态 具体的1.变量名由字母数字下划线组成 2.不能以数字开头 3.不能使用关键字命名为变量名 两种写法 1.驼峰体(由字母组 ...

  10. WinHex数据恢复笔记(一)

    WinHex数据恢复功能强大,可以从硬件簇上扇区进行数据扫描恢复.首先对winhex的各个功能介绍.之后对实例记录一个Word文档删除后进行恢复. 1.WinHex数据恢复软件的编辑区输入与其他普通文 ...