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 ...
随机推荐
- RCP 主题切换
第一步 编写css文件,放到项目目录下 第二步 添加切换主题扩展点 第三步 设置主题 public void switchTheme(String themeID) { Bu ...
- Android 自定义debug.keystore
场景分析: 有时候,我们要使用第三方的服务,需要提供自己的包名以及keystore的sha1值,比如微信支付,百度地图,都需要包名和keystore的sha1值作为唯一标识.这时候我们测试的时候,如果 ...
- Stephen 博客正式开通 【个人公众号:Stephen 】
个人博客开通. 个人公众号:Stephen
- IOS开发学习笔记018- 一般控件的使用
1.移动 2.动画 3.缩放 3.旋转 4.简化代码 5.总结 UIButton 的两种状态 normal highlighted 1.移动 OC语法规定:不允许直接修改某个对象中结构体属性的成员. ...
- 微信小程序-----校园头条详细开发之首页
1.首页展示功能的实现 1.1 结构 1.2 代码实现 1.2.1 界面的设计这里就不多说了,样式都是我自己写的,还有就是页面的跳转,看详细代码 var app = getApp() Page({ ...
- python 学习分享-实战篇增删改查作业
一大波函数来袭 作业要求: 1本次作业通过空格及逗号,将文件拆分成列表,在通过判断add.del.update.select等关键字,来判断用户执行的是哪种命令,根据不同的命令调用不同的函数去处理. ...
- 性能测试工具—Jmeter
Jmeter视频教程: 在我要自学网搜索:关键字即可
- Leetcode 629.K个逆序对数组
K个逆序对数组 给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数. 逆序对的定义如下:对于数组的第i个和第 j个元素,如果满i < j且 ...
- mysql数据库二进制初始化出现:170425 17:47:04 [ERROR] /application/mysql//bin/mysqld: unknown option '--skip-locking' 170425 17:47:04 [ERROR] Aborting 解决办法
[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --basedir=/application/mysql/ --data ...
- 初学Linux 命令
查看ip:ifconfig 切换用户:us root(root为用户名) 显示当前目录:pwd 列出当前目录下所有文件:ls 进入某个目录 :cd 创建一个文件夹:mkdir 创建多个目录(当没有该父 ...