Interval query
题意:
给出数轴上的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相关推荐
- 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]上,有多少个互不相 ...
- HDU 4343 Interval query 倍增思想, DP
题目大意: 就是现在给出N个区间(纠结了一下应该都是开区间), 区间(l, r)满足两边端点都是不超过10^9的非负整数, 现在有M次询问, 每次询问区间(L, R)中最多可以找出多少个区间(来自于N ...
- hdu 4343 Interval query
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4343 题目大意:求区间最多有多少不相交线段. 题目思路:先用倍增思想求出dp[i][j]表示左端点为j ...
- 【HDOJ】4343 Interval query
最大不相交集合的数量. 思路是dp[i][j]表示已经有i个不相交集合下一个不相交集合的最右边界. 离散化后,通过贪心解. 1 /* 4343 */ 2 #include <iostream&g ...
- HDU4343[Interval query]--倍增思想+二分+离散
博主吐槽一下:本蒟蒻差点就屎在这道鬼畜题上了QAQ(大佬可以忽视) [链接] HDU4343 [题目大意] 给你N个区间,和M个询问,对于每个询问,输出询问的一段区间内最多有多少段互不相交的区间. [ ...
- hdu4343 Interval query【贪心+倍增】
题目大意: 给定n个数轴上特殊的开区间(l,r),m次询问,每次询问(a,b)之间最多有多少个不相交的特殊区间.(1<=n,m<=100000,0<=l,r,a,b<=1000 ...
- HDU 4343 Interval query(倍增思想+贪心)
题意:给定n(n<=100000)个区间(左闭右开)和m(m<=100000)次询问[l, r],问所有在[l, r]区间内最多有多少个两两不相交的区间., 思路:首先贪心的思想,去 ...
- 【HDU 4343】Interval query(倍增)
BUPT2017 wintertraining(15) #8D 题意 给你x轴上的N个线段,M次查询,每次问你[l,r]区间里最多有多少个不相交的线段.(0<N, M<=100000) 限 ...
- [hdu4343]interval query
xx 转载于:https://www.cnblogs.com/lxzl/p/11207128.html
最新文章
- Javascript使用Ajax跟踪历史
- ecs服务器网站文件放在哪里,云服务器ecs文件放哪里
- Java 技术之垃圾回收机制
- wgan 不理解 损失函数_AI初识:深度学习中常用的损失函数有哪些?
- Python容器类型公共方法汇总
- 正则表达式(基础、常用)----JavaScript
- 品质主管每日工作需要做哪些_做微信社群运营需要用到哪些工具来铺助工作呢?...
- 史上最详细nodejs版本管理器nvm的安装与使用(附注意事项和优化方案)
- HTML浅学入门---基础知识 (1)基本规则
- iOS 8.0正式公布啦
- Docker-registry + GlusterFS
- 如何成长为一名专业的程序员?
- 独家|对决金融云:备案将至,谁得先手
- matplotlib学习日记(八)----完善统计图
- windows 下安装redis
- 360 os3.0 android7.1,【360 N6 Pro】360OS安卓7.1系统V3.0.087付费纯净版ROOT刷机包
- 华为云数据库GaussDB(for openGauss):初次见面,认识一下
- 提示网站服务器403,浏览器打开网页时出现http 403 禁止访问错误是什么原因?
- linux系统进去是guest用户t,ubuntu普通用户变为root用户后,只能guest身份进系统(linux的权限问题)...
- IWAM账号密码不一致引起IIS无法处理ASP文件