HDU 4343 Interval query(贪心 + 倍增)
题目链接 2012多校5 Problem D
题意 给定$n$个区间,数字范围在$[0, 10^{9}]$之间,保证左端点严格大于右端点。
然后有$m$个询问,每个询问也为一个区间,数字范围在$[0, 10^{9}]$之间,保证左端点严格大于右端点。
每个询问求的是在当前区间内能得到不相交的给定的区间的数目的最大值。
为了方便我先把给定区间的左端点全部$+1$,询问的区间的左端点也通通$+1$。
然后全部扔到数组里面去离散化一遍,再取出来。
这个时候问题就比较直观了。
其实这个题和 Codeforces 597B 十分类似,只不过现在我们这个题给出了很多区间的询问。
那题我也写了题解,这题之前的预处理和那题基本都一样。
但是那道题只有一个询问,而且是整个区间,这题有很多询问,而且是多个区间。
我们可以考虑倍增。
设$f[i][j]$为从$j$开始考虑取$2^{i}$个区间,跳到的终点的最小值。
若无法取$2^{i}$个区间,那么$f[i][j] = -1$。
于是我们可以根据$f[i][j]$能在$O(logn)$内回答一个询问。
时间复杂度$O(nlogn)$
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const int N = 100010; const int inf = 1e9 + 10; int n, m;
int cnt; struct node{
int x, y, s, t;
friend bool operator < (const node &a, const node &b){
return a.x == b.x ? a.y < b.y : a.x < b.x;
}
} a[N], c[N], q[N]; int b[N << 2];
int f[21][N << 2];
int lg[N << 2];
int mx;
int tot, itot; bool cmp(const node &a, const node &b){
return a.s == b.s ? a.t > b.t : a.s < b.s;
} int main(){ lg[1] = 0;
rep(i, 2, 4e5) lg[i] = lg[i >> 1] + 1; while (~scanf("%d%d", &n, &m)){
memset(f, -1, sizeof f);
rep(i, 1, n){
scanf("%d%d", &a[i].x, &a[i].y);
++a[i].x;
a[i].s = a[i].y;
a[i].t = a[i].x + inf;
} sort(a + 1, a + n + 1, cmp); cnt = 0;
for (int i = 1, j; i <= n;){
j = i + 1;
while (j <= n && a[j].t <= a[i].t) ++j;
c[++cnt] = a[i];
i = j;
} rep(i, 1, m){
scanf("%d%d", &q[i].x, &q[i].y);
++q[i].x;
} tot = 0;
rep(i, 1, cnt) b[++tot] = c[i].x, b[++tot] = c[i].y;
rep(i, 1, m) b[++tot] = q[i].x, b[++tot] = q[i].y; sort(b + 1, b + tot + 1); itot = unique(b + 1, b + tot + 1) - b - 1;
rep(i, 1, cnt){
c[i].x = lower_bound(b + 1, b + itot + 1, c[i].x) - b;
c[i].y = lower_bound(b + 1, b + itot + 1, c[i].y) - b;
} rep(i, 1, m){
q[i].x = lower_bound(b + 1, b + itot + 1, q[i].x) - b;
q[i].y = lower_bound(b + 1, b + itot + 1, q[i].y) - b;
} mx = max(c[cnt].y, q[m].y); rep(i, 1, mx){
if (i > c[cnt].x) continue;
int l = 1, r = cnt;
while (l + 1 < r){
int mid = (l + r) >> 1;
if (c[mid].x >= i) r = mid;
else l = mid + 1;
} int t = c[l].x >= i ? l : r;
f[0][i] = c[t].y;
} rep(i, 1, 19) rep(j, 1, mx) f[i][j] = f[i - 1][f[i - 1][j] + 1]; rep(op, 1, m){
int x = q[op].x, y = q[op].y;
int ans = 0;
dec(i, 19, 0) if ((~f[i][x]) && (f[i][x] <= y)){
ans += 1 << i;
x = f[i][x] + 1;
}
printf("%d\n", ans);
}
} return 0;
}
HDU 4343 Interval query(贪心 + 倍增)的更多相关文章
- 【HDU 4343】Interval query(倍增)
BUPT2017 wintertraining(15) #8D 题意 给你x轴上的N个线段,M次查询,每次问你[l,r]区间里最多有多少个不相交的线段.(0<N, M<=100000) 限 ...
- 【HDOJ】4343 Interval query
最大不相交集合的数量.思路是dp[i][j]表示已经有i个不相交集合下一个不相交集合的最右边界.离散化后,通过贪心解. /* 4343 */ #include <iostream> #in ...
- HDU 4343 D - Interval query 二分贪心
D - Interval queryTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest ...
- HDU 4343 贪心
D - Interval queryTime Limit: 1.5 Sec Memory Limit: 256 MB Description This is a very simple questio ...
- HDU 4442 Physical Examination(贪心)
HDU 4442 Physical Examination(贪心) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=4442 Descripti ...
- 刷题总结——Interval query(hdu4343倍增+贪心)
题目: Problem Description This is a very simple question. There are N intervals in number axis, and M ...
- Interval query
题意: 给出数轴上的N个区间,M个询问"QUERY(a, b)", 意为[a, b]之间不相交的集合的最大数量是多少. 解法: 考虑 $O(n)$ 的贪心做法,预处理出对于每一个位 ...
- Codeforces 983E - NN country(贪心+倍增优化)
Codeforces 题面传送门 & 洛谷题面传送门 一道(绝对)偏简单的 D1E,但是我怕自己过若干年(大雾)忘了自己的解法了,所以过来水篇题解( 首先考虑怎么暴力地解决这个问题,不难发现我 ...
- HDU 5835 Danganronpa (贪心)
Danganronpa 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5835 Description Chisa Yukizome works as ...
随机推荐
- HDU - 6514 Monitor(二维差分)
题意 给定一个\(n×m\)的矩阵.(\(n×m <= 1e7\)). \(p\)次操作,每次可以在这个矩阵中覆盖一个矩形. \(q\)次询问,每次问一个矩形区域中,是否所有的点都被覆盖. 解析 ...
- [USACO]玉米实验(单调队列)
Description 约翰决定培育新的玉米品种以提高奶牛的产奶效率.约翰所有的土地被分成 N ×N 块,其中第 r行第 c 列的玉米质量为 Ar,c.他打算找一块质量比较均匀的土地开始自己的实验.经 ...
- django的as_view方法实现分析
django的类视图拥有自动查找指定方法的功能, 通过调用是通过as_view()方法实现 urls.py from meduo_mall.demo import views urlpatterns ...
- Thread和Runnable的子类调用
实现线程的两种方式: 继承Thread类. 实现Runnable接口. 下面是一个小案例: public class Thread和Runnable { public static void main ...
- Django admin模块使用search时报错:django.core.exceptions.FieldError: Related Field got invalid lookup: contains
日志如下: <class 'django.core.handlers.wsgi.WSGIRequest'> ------------registered_admins: {'spaceCl ...
- 将FragmentManger事务添加到返回栈中
FragmentManger事务添加或替换的 Fragment 后,这时点击 Back 键,程序并不会返回添加之前的状态. 我们可以使用 Transaction 对象的 addToBackStack( ...
- SQL语句Not IN优化方案
总结网友们在CSDN社区上对于not in的优化策略,整理如下,备查. select * from emp where emp_no not in (select emp_no from emp ...
- hnust 土豪金的加密解密
问题 G: 土豪金的加密与解密 时间限制: 1 Sec 内存限制: 128 MB提交: 466 解决: 263[提交][状态][讨论版] 题目描述 有一位姓金的同学因为买了一部土豪金,从此 ...
- linux 相关知识
在mac 终端中可以直接访问ssh 命令:ssh root@127.0.0.* 批量删除文件: 当前目录下所有 *.html文件,除了index.html [root@whr ...
- BZOJ 1036: [ZJOI2008]树的统计Count(树链剖分)
树的统计CountDescription一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改 ...