去博客园看该题解

题意

  给定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. boost.Asio lib

    Documentation for Boost.Asio http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio.html https://w ...

  2. HBase基础架构及原理

    1. HBase框架简单介绍 HBase是一个分布式的.面向列的开源数据库,它不同于一般的关系数据库,是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式.HBas ...

  3. 进程命令ps/top/kill

    进程: 通俗的说就是 当前正在执行的一个程序 命令: ps 英文: process status 作用: 查看进程的详细状况 选项: a:显示终端上的所有进程,包括其他用户的进程 u:显示进程的详细状 ...

  4. jemter 新增sha256函数

    1  https://blog.csdn.net/y100100/article/details/80701049 2  https://blog.csdn.net/y100100/article/d ...

  5. Confluence 6 PostgreSQL 问题解决

    如果 Confluence 提示没有 class 文件,你可能将你的 JDBC 驱动放置到了错误的文件夹. 如果你不能从你从 Confluence 中连接到 PostgreSQL ,并且这 2 个服务 ...

  6. Confluence 6 自定义站点和空间布局

    你可以通过编辑布局文件来修改 Confluence 的外观和感觉(也可以被称为装饰).编辑这些文件将会允许你对整个 Confluence 站点的外观和感觉进行修改或者仅仅是一个独立的空间. 当你对一个 ...

  7. 关于deepin linux15.6-15.9.1系统播放视频卡顿解决办法

    关于deepin linux15.6-15.9.1系统播放视频卡顿解决办法 chrome浏览器 关闭chrome硬件加速模式 设置>高级>使用硬件加速模式 注释:由于视频卡顿是因显卡驱动问 ...

  8. Jquery如何获取iframe里面body的html呢?

    如果是自己网页的话,可以这样,$("iframe").contents().find("body").html();意思是,获取iframe里面页面body的内 ...

  9. python之vscode配置开发调试环境

    在vscode中下载python插件,下载量最多的就是 打开launch.json,把以下代码粘贴进去即可 { // 使用 IntelliSense 了解相关属性. // 悬停以查看现有属性的描述. ...

  10. MybatisPlus使用介绍

    创建UserController测试类 package com.cppdy.controller; import org.apache.ibatis.session.RowBounds; import ...