题意:

给出数轴上的N个区间,M个询问"QUERY(a, b)", 意为[a, b]之间不相交的集合的最大数量是多少。

解法:

考虑 $O(n)$ 的贪心做法,预处理出对于每一个位置$i$,满足$i \leq L_j$ 的 $R_j$的最小值

这样暴力向后找即可。

用倍增优化这个过程 $O(nlogn)$

#include <bits/stdc++.h> #define N 100010using namespace std;struct node
{int l,r;
}a[N],q[N];int n,m,tot0;
int a0[N<<2];
int minR[N<<2][21];bool cmp(node a,node b)
{return a.l<b.l;
}int ask(int l,int r)
{int x = l,ans = 0;for(int i=20;~i;i--)if(minR[x][i] <= r)x = minR[x][i], ans += (1<<i);return ans;
}int main()
{while(~scanf("%d%d",&n,&m)){a0[0] = 0;for(int i=1;i<=n;i++){scanf("%d%d",&a[i].l,&a[i].r);a0[++a0[0]] = a[i].l;a0[++a0[0]] = a[i].r;}for(int i=1;i<=m;i++){scanf("%d%d",&q[i].l,&q[i].r);a0[++a0[0]] = q[i].l;a0[++a0[0]] = q[i].r;}sort(a0+1,a0+a0[0]+1);tot0=1;for(int i=2;i<=a0[0];i++) if(a0[i]!=a0[i-1]) a0[++tot0] = a0[i];for(int i=1;i<=n;i++){a[i].l = lower_bound(a0+1,a0+tot0+1,a[i].l) - a0;a[i].r = lower_bound(a0+1,a0+tot0+1,a[i].r) - a0;}sort(a+1,a+n+1,cmp);int j=n,tmpR = tot0+1;for(int i=tot0;i>=1;i--){while(j>0 && a[j].l >= i){tmpR = min(tmpR, a[j].r);j--;}minR[i][0] = tmpR;}for(int t=1;t<=20;t++)for(int i=1;i<=tot0;i++){if(minR[i][t-1]<=tot0)minR[i][t] = minR[minR[i][t-1]][t-1];else minR[i][t] = tot0+1;}for(int i=1;i<=m;i++){q[i].l = lower_bound(a0+1,a0+tot0+1,q[i].l) - a0;q[i].r = lower_bound(a0+1,a0+tot0+1,q[i].r) - a0;printf("%d\n",ask(q[i].l,q[i].r));}}return 0;
}

View Code

转载于:https://www.cnblogs.com/lawyer/p/6832411.html

Interval query相关推荐

  1. HDU  4343 Interval query

    HDU 4343 Interval query 题目给定nn个区间(li,ri),1≤i≤n(l_i,r_i),1\leq i\leq n MM次询问.询问在区间[L,R][L,R]上,有多少个互不相 ...

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

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

  3. hdu 4343 Interval query

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4343 题目大意:求区间最多有多少不相交线段. 题目思路:先用倍增思想求出dp[i][j]表示左端点为j ...

  4. 【HDOJ】4343 Interval query

    最大不相交集合的数量. 思路是dp[i][j]表示已经有i个不相交集合下一个不相交集合的最右边界. 离散化后,通过贪心解. 1 /* 4343 */ 2 #include <iostream&g ...

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

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

  6. hdu4343 Interval query【贪心+倍增】

    题目大意: 给定n个数轴上特殊的开区间(l,r),m次询问,每次询问(a,b)之间最多有多少个不相交的特殊区间.(1<=n,m<=100000,0<=l,r,a,b<=1000 ...

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

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

  8. 【HDU 4343】Interval query(倍增)

    BUPT2017 wintertraining(15) #8D 题意 给你x轴上的N个线段,M次查询,每次问你[l,r]区间里最多有多少个不相交的线段.(0<N, M<=100000) 限 ...

  9. [hdu4343]interval query

    xx 转载于:https://www.cnblogs.com/lxzl/p/11207128.html

最新文章

  1. Javascript使用Ajax跟踪历史
  2. ecs服务器网站文件放在哪里,云服务器ecs文件放哪里
  3. Java 技术之垃圾回收机制
  4. wgan 不理解 损失函数_AI初识:深度学习中常用的损失函数有哪些?
  5. Python容器类型公共方法汇总
  6. 正则表达式(基础、常用)----JavaScript
  7. 品质主管每日工作需要做哪些_做微信社群运营需要用到哪些工具来铺助工作呢?...
  8. 史上最详细nodejs版本管理器nvm的安装与使用(附注意事项和优化方案)
  9. HTML浅学入门---基础知识 (1)基本规则
  10. iOS 8.0正式公布啦
  11. Docker-registry + GlusterFS
  12. 如何成长为一名专业的程序员?
  13. 独家|对决金融云:备案将至,谁得先手
  14. matplotlib学习日记(八)----完善统计图
  15. windows 下安装redis
  16. 360 os3.0 android7.1,【360 N6 Pro】360OS安卓7.1系统V3.0.087付费纯净版ROOT刷机包
  17. 华为云数据库GaussDB(for openGauss):初次见面,认识一下
  18. 提示网站服务器403,浏览器打开网页时出现http 403 禁止访问错误是什么原因?
  19. linux系统进去是guest用户t,ubuntu普通用户变为root用户后,只能guest身份进系统(linux的权限问题)...
  20. IWAM账号密码不一致引起IIS无法处理ASP文件

热门文章

  1. Redis 开发陷阱及避坑指南!
  2. 狡猾无比的超级网络间谍
  3. 一入职!就遇到MySQL亿级大表优化....
  4. 如何在7分钟内黑掉40家网站?
  5. Hadoop 之父:普通程序员到顶级公司 CTO 的进阶之路
  6. 深入剖析分布式监控 CAT —— 消息文件存储
  7. 一位 83 岁独立开发者教会我的道理
  8. Java对象的序列化与反序列化
  9. 力压 Java 与 C 的 Python 现状如何了?
  10. 【Python】青少年蓝桥杯_每日一题_10.11_小球反弹