题目链接  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(贪心 + 倍增)的更多相关文章

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

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

  2. 【HDOJ】4343 Interval query

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

  3. HDU 4343 D - Interval query 二分贪心

    D - Interval queryTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest ...

  4. HDU 4343 贪心

    D - Interval queryTime Limit: 1.5 Sec Memory Limit: 256 MB Description This is a very simple questio ...

  5. HDU 4442 Physical Examination(贪心)

    HDU 4442 Physical Examination(贪心) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=4442 Descripti ...

  6. 刷题总结——Interval query(hdu4343倍增+贪心)

    题目: Problem Description This is a very simple question. There are N intervals in number axis, and M ...

  7. Interval query

    题意: 给出数轴上的N个区间,M个询问"QUERY(a, b)", 意为[a, b]之间不相交的集合的最大数量是多少. 解法: 考虑 $O(n)$ 的贪心做法,预处理出对于每一个位 ...

  8. Codeforces 983E - NN country(贪心+倍增优化)

    Codeforces 题面传送门 & 洛谷题面传送门 一道(绝对)偏简单的 D1E,但是我怕自己过若干年(大雾)忘了自己的解法了,所以过来水篇题解( 首先考虑怎么暴力地解决这个问题,不难发现我 ...

  9. HDU 5835 Danganronpa (贪心)

    Danganronpa 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5835 Description Chisa Yukizome works as ...

随机推荐

  1. [BZOJ2947]促销(Splay)

    Description Great Bytelandish的超级市场网络请你编写一个程序模拟促销商品的成本费用(simulating costs of the promotionbeing prepa ...

  2. mac terminal基本命令

    文件目录 首先要清楚几个文件目录: " / "  :根目录 " ~ " :用户主目录的缩写.例如当前用户为esther,那么" ~ "展开来 ...

  3. 驱动模块 .ko

    模块: 模块机制,作用搞高LINUX操作系统的扩充性. 1. 模块概念: 1.动态可加载内核模块LKM 2.内核空间运行 3.是不是一执行文件,是一个没有经过链接,不能独立运行的一个目标文件(.c-& ...

  4. C#操作XML配置文件

    代码为C#操作xml配置文件的范例类,函数SetValue用于向配置文件写入一个值,GetValue用于根据Key获取相应值。这种方法的配置文件不需要手动创建,程序在运行后会自动处理创建。 注意:1. ...

  5. Python的网络编程socket模块

    (1)利用socket进行简单的链接 Python里面的socket支持UDP.TCP.以及进程间的通信,socket可以把我们想要发送的东西封装起来,发送过去,然后反解成原来的样子,事实上网路通信可 ...

  6. PAT1038(两个运行超时 未解决

    # include<iostream> # include<algorithm> using namespace std; int jishu(int a[],int N,in ...

  7. Java中转发与重定向的区别

        转发与重定向的区别 转发是服务器行为,重定向是客户端行为 1.转发在服务器端完成的:重定向是在客户端完成的2.转发的速度快:重定向速度慢3.转发的是同一次请求:重定向是两次不同请求4.转发不会 ...

  8. mysql错误之2014

    error:2014 Commands out of sync; you can't run this command now 这个错误号我也真是醉了. 一直纠结于为什么存储过程执行完,commit操 ...

  9. "二进制" 转化为 "十六进制

    //"二进制" 转化为 "十六进制" void To_string(uint8 *dest,char * src,uint8 length) { uint8 * ...

  10. 几个实用的 jQuery 插件

    1. owl.carousel -- 强大实用的jQuery幻灯片插件 2. jquery.nicescroll.min.js -- 自定义滚动条样式,支持 div,iframe,html 等. 3. ...