题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4343

题目大意:给定N(N<=100000)个区间(左闭右开)和M(M<=100000)个询问[l, r],问所有满足[s,t)包含于于[l, r]的区间中最多能选出多少个,使得他们两两不相交。

解题思路:首先将坐标离散化,将区间排序后删掉可以覆盖其他区间的大区间。
这时若将剩余区间的左端点坐标排序,左端点坐标必然严格上升且对应的右端点坐标也是严格上升的。
此题的贪心思想较为普及,即按y的升序进行贪心固定区间询问的最大数量,不再赘述。
设g[1][x]为从坐标x开始向右遇到的第一个有效区间的右端点坐标,另g[i][x] = g[1][g[i-1][x]],若不存在则为正无穷。
则g[k][x]表示从坐标x开始,在经过不相交的k个区间后,第k个区间的右端点的坐标。
对g进行倍增,即设f[k][x] = g[2^k][x]。则对于一次询问(l,r),可利用f枚举答案各个二进制数位得到答案。
f[k][x] = f[k-1][f[k-1][x]],f[0][x] = g[1][x]。g只存在于思维过程中。

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int N=100050;
int n,m,opt[20][N*2],x[N*2],cnt;
struct node
{int l,r;void read(){ scanf("%d%d",&l,&r); x[cnt++]=l; x[cnt++]=r; }void print(){ printf("%d %d\n",l,r); }bool operator <(const node tmp) const{ return l<tmp.l||(l==tmp.l&&r<tmp.r); }
}no[N];
inline int getid(int val,bool f)
{if(!f) return lower_bound(x,x+cnt,val)-x;return upper_bound(x,x+cnt,val)-x-1;
}
int calc(int l,int r)
{if(l>r) return 0;if(l==cnt||r==-1) return 0;int ret=0;for(int i=19;i>=0;i--){if(opt[i][l]<=r) {ret+=(1<<i);l=opt[i][l];}}return ret;
}
int main()
{
//    freopen("1.in","r",stdin);
//    freopen("2.out","w",stdout);while(scanf("%d%d",&n,&m)!=-1){cnt=0;for(int i=0;i<n;i++){no[i].read();}sort(no,no+n);sort(x,x+cnt);cnt=unique(x,x+cnt)-x;for(int i=0;i<n;i++){no[i].l=getid(no[i].l,0);no[i].r=getid(no[i].r,1);}x[cnt]=cnt;int mn=cnt,r=n;for(int i=cnt-1;i>=0;i--){while(r>0&&no[r-1].l>=i){r--;mn=min(mn,no[r].r);}opt[0][i]=mn;}for(int i=0;i<20;i++) opt[i][cnt]=cnt;for(int i=1;i<20;i++){for(int j=0;j<cnt;j++){opt[i][j]=opt[i-1][opt[i-1][j]];}}while(m--){int l,r;scanf("%d%d",&l,&r);l=getid(l,0); r=getid(r,1);printf("%d\n",calc(l,r));}}return 0;
}

hdu4343倍增思想相关推荐

  1. HDU4343[Interval query]--倍增思想+二分+离散

    博主吐槽一下:本蒟蒻差点就屎在这道鬼畜题上了QAQ(大佬可以忽视) [链接] HDU4343 [题目大意] 给你N个区间,和M个询问,对于每个询问,输出询问的一段区间内最多有多少段互不相交的区间. [ ...

  2. python【数据结构与算法】倍增思想

    文章目录 1 概述 2 例题 1 概述 倍增是一种思想,每次将考虑的范围扩大或减少一倍从而达到加速的效果,将某一步的O(n)优化到O(logn) 也就是一种自底向上的二分 如快速幂 顾名思义就是一倍一 ...

  3. HDU 4343 Interval query 倍增思想, DP

    题目大意: 就是现在给出N个区间(纠结了一下应该都是开区间), 区间(l, r)满足两边端点都是不超过10^9的非负整数, 现在有M次询问, 每次询问区间(L, R)中最多可以找出多少个区间(来自于N ...

  4. HDU 4343 Interval query(倍增思想+贪心)

     题意:给定n(n<=100000)个区间(左闭右开)和m(m<=100000)次询问[l, r],问所有在[l, r]区间内最多有多少个两两不相交的区间., 思路:首先贪心的思想,去 ...

  5. 祖孙询问(LCA+倍增思想)

    1. 问题描述: 给定一棵包含 n 个节点的有根无向树,节点编号互不相同,但不一定是 1∼n.有 m 个询问,每个询问给出了一对节点的编号 x 和 y,询问 x 与 y 的祖孙关系. 输入格式 输入第 ...

  6. 【BZOJ3551】Peaks加强版,主席树+kruskal重构+dfs序+倍增思想

    传送门 写在前面:一道调了不止一上午的题目 思路:我们先来看一下神奇的kruskal重构树 图中红色的是原图的边权,黑色的是原图上的点 这样生成的树有一些十分优美的性质: 1.二叉树(好吧这题意义不大 ...

  7. Masonry 布局tag标签(4343排列)

    广告 欢迎大家一起交流 QQ群 139852091 公众号 我是jpg 效果 image.png demo // TagAppDto dto; // List<TagAppDto> dto ...

  8. 0x06.基本算法 — 倍增

    目录 一.倍增 0.例题引入 1.AcWing 109.Genius ACM(归并+倍增) 二.ST算法 2.luogu P3865 [模板]ST表 三.求LCA(Least Common Ances ...

  9. 关于树论【LCA树上倍增算法】

    补了一发LCA,表示这东西表面上好像简单,但是细节真挺多. 我学的是树上倍增,倍增思想很有趣~~(爸爸的爸爸叫奶奶.偶不,爷爷)有一个跟st表非常类似的东西,f[i][j]表示j的第2^i的祖先,就是 ...

最新文章

  1. 单目摄像头检测6D姿态
  2. 腾讯面试题:创建索引时,你会怎么考虑呢?(看完你就能和面试官谈人生了)
  3. 1. 自然语言处理描述
  4. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(九)
  5. perl脚本中的特殊字符也与V字符串
  6. python入门-Python入门之类(class)
  7. java性能检测工具_老李分享:JAVA性能监控工具
  8. vue学习笔记-接口调用-axios
  9. 机顶盒系统升级服务器,服务器及其软件升级方法、IP机顶盒及其软件升级方法...
  10. OSChina 周三乱弹 ——随风潜入夜,润物细无声,晓看红湿处……
  11. 麦考利久期公式(c语言实现)
  12. 版权声明--关于本人BLOG发表的带有原创标识的文章相关
  13. editplus java显示竖线_EditPlus对齐竖线怎么调出来?
  14. 腾讯云开放mysql端口_腾讯云服务器Mysql开启3306端口远程访问
  15. 放大器为什么会被限幅?原因所在!
  16. 向华为学习集成供应链管理:让产供销协同起来的供应链计划管理
  17. html样式表三种类型包括,css样式有哪几种类型
  18. 文内码转换巨匠增强版 官方版
  19. Spring事务问题
  20. k8s存储PV与PVC使用详解

热门文章

  1. 2019年JAVA程序设计第二周編程总结
  2. 前端下载文件的写法(兼容IE(IE9+) Firefox chrome)
  3. 传统健身模式盛行已久,他为什么坚持开一家24H智能健身房?
  4. 大数据告诉你,母亲节送妈妈什么礼物会让她更开心
  5. 08.01大疆创新2022数字芯片笔试
  6. Android Binder 全解析(1) -- 概述
  7. Flutter之drawer详细分析(你要的操作都有)
  8. matalb 图像处理 低通滤波和高通滤波 (理想,巴特沃斯,高斯 含代码)
  9. php 阴历年份,阳历转农历时的数字年份不正确
  10. 年底被裁,程序员 2020 年的出路在哪里?,大专生出身