HDU4343Interval query 倍增
去博客园看该题解
题意
给定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 倍增的更多相关文章
- 刷题总结——Interval query(hdu4343倍增+贪心)
题目: Problem Description This is a very simple question. There are N intervals in number axis, and M ...
- QTREE2 spoj 913. Query on a tree II 经典的倍增思想
QTREE2 经典的倍增思想 题目: 给出一棵树,求: 1.两点之间距离. 2.从节点x到节点y最短路径上第k个节点的编号. 分析: 第一问的话,随便以一个节点为根,求得其他节点到根的距离,然后对于每 ...
- 【HDU 4343】Interval query(倍增)
BUPT2017 wintertraining(15) #8D 题意 给你x轴上的N个线段,M次查询,每次问你[l,r]区间里最多有多少个不相交的线段.(0<N, M<=100000) 限 ...
- [SPOJ913]QTREE2 - Query on a tree II【倍增LCA】
题目描述 [传送门] 题目大意 给一棵树,有两种操作: 求(u,v)路径的距离. 求以u为起点,v为终点的第k的节点. 分析 比较简单的倍增LCA模板题. 首先对于第一问,我们只需要预处理出根节点到各 ...
- SPOJ375 Query on a tree 【倍增,在线】
题目链接[http://www.spoj.com/problems/QTREE/] 题意:给出一个包含N(N<=10000)节点的无根树,有多次询问,询问的方式有两种1.DIST a b 求a ...
- 【倍增】LCM QUERY
给一个序列,每次给一个长度l,问长度为l的区间中lcm最小的. 题解:因为ai<60,所以以某个点为左端点的区间的lcm只有最多60种的情况,而且相同的lcm区间的连续的. 所以就想到一个n*6 ...
- Query on a tree II 倍增LCA
You are given a tree (an undirected acyclic connected graph) with N nodes, and edges numbered 1, 2, ...
- 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 ...
- HDU 4343 Interval query(贪心 + 倍增)
题目链接 2012多校5 Problem D 题意 给定$n$个区间,数字范围在$[0, 10^{9}]$之间,保证左端点严格大于右端点. 然后有$m$个询问,每个询问也为一个区间,数字范围在$[ ...
随机推荐
- boost.Asio lib
Documentation for Boost.Asio http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio.html https://w ...
- HBase基础架构及原理
1. HBase框架简单介绍 HBase是一个分布式的.面向列的开源数据库,它不同于一般的关系数据库,是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式.HBas ...
- 进程命令ps/top/kill
进程: 通俗的说就是 当前正在执行的一个程序 命令: ps 英文: process status 作用: 查看进程的详细状况 选项: a:显示终端上的所有进程,包括其他用户的进程 u:显示进程的详细状 ...
- jemter 新增sha256函数
1 https://blog.csdn.net/y100100/article/details/80701049 2 https://blog.csdn.net/y100100/article/d ...
- Confluence 6 PostgreSQL 问题解决
如果 Confluence 提示没有 class 文件,你可能将你的 JDBC 驱动放置到了错误的文件夹. 如果你不能从你从 Confluence 中连接到 PostgreSQL ,并且这 2 个服务 ...
- Confluence 6 自定义站点和空间布局
你可以通过编辑布局文件来修改 Confluence 的外观和感觉(也可以被称为装饰).编辑这些文件将会允许你对整个 Confluence 站点的外观和感觉进行修改或者仅仅是一个独立的空间. 当你对一个 ...
- 关于deepin linux15.6-15.9.1系统播放视频卡顿解决办法
关于deepin linux15.6-15.9.1系统播放视频卡顿解决办法 chrome浏览器 关闭chrome硬件加速模式 设置>高级>使用硬件加速模式 注释:由于视频卡顿是因显卡驱动问 ...
- Jquery如何获取iframe里面body的html呢?
如果是自己网页的话,可以这样,$("iframe").contents().find("body").html();意思是,获取iframe里面页面body的内 ...
- python之vscode配置开发调试环境
在vscode中下载python插件,下载量最多的就是 打开launch.json,把以下代码粘贴进去即可 { // 使用 IntelliSense 了解相关属性. // 悬停以查看现有属性的描述. ...
- MybatisPlus使用介绍
创建UserController测试类 package com.cppdy.controller; import org.apache.ibatis.session.RowBounds; import ...