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$个询问,每个询问也为一个区间,数字范围在$[ ...
随机推荐
- [转载]RabbitMQ消息可靠性分析
有很多人问过我这么一类问题:RabbitMQ如何确保消息可靠?很多时候,笔者的回答都是:说来话长的事情何来长话短说.的确,要确保消息可靠不只是单单几句就能够叙述明白的,包括Kafka也是如此.可靠并不 ...
- Spring initializr使用
Spring initializr 是Spring 官方提供的一个很好的工具,用来初始化一个Spring boot 的项目. 有两种方式可以使用Spring initializr来创建一个项目: ht ...
- Golang 类型转换,断言和显式强制转换
1 前言 类型转换,可以用断言(只能使用在interface{}类型转换成其它类型)和显式类型强制转换(常规是用于基本类型) 2 代码 //graphql-go func(params graphql ...
- Spring通过SchedulerFactoryBean实现调度任务的配置(定时器)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- Python- 索引 B+数 比如书的目录
1.索引 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题, 在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作, 因此对查询 ...
- 31)django-序列化
目录 1)序列化 2)为什么不用json序列化 3)django序列化QuerySet,ErrorDict数据 一:序列化 序列化是将对象状态转换为可保持或传输的格式的过程 反序列化是指将存储在存储媒 ...
- Confluence 6 启用主题评论
页面或者博客页面中显示的评论以下面 2 种方式显示: 主题模式(Threaded):以继承回复的方式显示页面的评论.每一回复的评论将会在不同评论之间显示,以表示各个评论之间的关系. 平面模式(Flat ...
- 如何打包/运行jar包,及生成exe文件
关于如何打包/运行jar包,以及生成exe文件.之前各种查询.博客,终于搞明白究竟是咋回事.记得还做过笔记的.今天要打包生成exe用的时候,居然忘了咋怎来着.去查看之前的笔记,死活没找到(好像被删掉了 ...
- day03 变量 运算符 基本数据类型 输出功能 格式化输出
变量补充 变量的命名 1变量名的命名的大前提:应该能够反映出变量值所记录的状态 具体的1.变量名由字母数字下划线组成 2.不能以数字开头 3.不能使用关键字命名为变量名 两种写法 1.驼峰体(由字母组 ...
- WinHex数据恢复笔记(一)
WinHex数据恢复功能强大,可以从硬件簇上扇区进行数据扫描恢复.首先对winhex的各个功能介绍.之后对实例记录一个Word文档删除后进行恢复. 1.WinHex数据恢复软件的编辑区输入与其他普通文 ...