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$个询问,每个询问也为一个区间,数字范围在$[ ...
随机推荐
- C和C++相互调用
在项目中融合C和C++有时是不可避免的,在调用对方的功能函数的时候,或许会出现这样那样的问题.近来在主程序是C语言,而调用C++功能函数的时候,C++的*.h头文件都能找到,功能函数也都定义了,最重要 ...
- appium+java(四)微信公众号自动化测试实践
前言 随着手机阅读的普遍应用,微信公众号阅读,更为普遍,微信和qq一样,都是基于腾讯自研X5内核,不是google原生webview(其实就是进行了二次定制).实质上也是混合应用的一种,现在很多app ...
- REST风格接口测试利器Wisdom rest-client
前言 偶然间接触到Wisdom rest-client这款测试工具,后来经过尝试体验,感觉还不错,现在分享给大家,如何使用这款测试利器 Wisdom rest-client是什么? Wisdom re ...
- JetBrains GoLand 2018 激活码/ 注册码(最新破解方法)
1 前言 本机测试环境如下: Goland版本:2018.1.5 电脑系统:win7 64位 JetbrainsCrack.jar:链接: https://pan.baidu.com/s/1blmN3 ...
- [正则表达式]匹配Unicode
一.PHP[PCRE]之Unicode PCRE支持的16进制字符编码转义符有 \x00-\xFF,或\x{num},num为任意位16进制数 但并不支持\u0000-\uFFFF这的形式 PCRE运 ...
- Python基础-入门之路PYTHON-包 相对导入&绝对导入
什么是包 包也是一种模块,但本质上就是一个文件夹 对于使用者而言 使用方式和模块没有任何区别 本质上就是一个文件夹 不同之处在于 多了一个__init__.py 叫包的初始化文件 import导入模块 ...
- Java编制至今总结和学习报告
日期:2018.8.19 星期日 博客期:006 说个事,本来想把博客园做一个交流平台的,可是交流度有点少...嗯...我看我还是把这个平台当作经验传授平台和自己的作品发布平台吧!Java的知识详解, ...
- React-Native到0.44版本后Navigator 不能用的问题
新升级 到0.46版本以后 Navigator 不能使用报错. 'Navigator is deprecated and has been removed from this package. It ...
- dubbo源码之Directory与LoadBalance
Directory: 集群目录服务Directory, 代表多个Invoker, 可以看成List<Invoker>,它的值可能是动态变化的比如注册中心推送变更.集群选择调用服务时通过目录 ...
- hdu2460 e-DCC染色缩点+暴力LCA
/* 给定一个无向图,往里面加边,问加第i条边时图中的桥数 首先肯定要求初始状态下的桥,染色缩点 每次给定的边为(u,v), 那么u->lca(u,v)->v路上的所有边都不再是桥 求LC ...