题意

有\(n\)条线段,区间为\([l_i, r_i]\),每次询问\([x_i, y_i]\),问要被覆盖最少要用多少条线段。

思路

\(f[i][j]\)表示以\(i\)为左端点,用了\(2^j\)条线段,最远到哪里。

然后从大到小贪心即可,类似于倍增找LCA的过程。

代码

#include <bits/stdc++.h>
using namespace std; #define N 200010
#define M 500010
#define D 20
int n, q;
int l[N], r[N];
int f[M][D]; int work(int x, int y) {
int ans = 0;
for (int i = D - 1; i >= 0; --i) {
if (f[x][i] < y) {
x = f[x][i];
ans |= (1 << i);
}
}
x = f[x][0]; ++ans;
if (x < y) ans = -1;
return ans;
} int main() {
while (scanf("%d%d", &n, &q) != EOF) {
for (int i = 1; i <= n; ++i) {
scanf("%d%d", l + i, r + i);
++l[i], ++r[i];
}
memset(f, 0, sizeof f);
for (int i = 1; i <= n; ++i) {
f[l[i]][0] = max(f[l[i]][0], r[i]);
}
for (int i = 1; i < M; ++i) {
f[i][0] = max(f[i][0], max(i, f[i - 1][0]));
for (int j = 1; j < D; ++j) {
f[i][j] = max(f[i][j], max(f[i][j - 1], f[i - 1][j]));
}
} for (int j = 1; j < D; ++j) {
for (int i = 1; i < M; ++i) {
f[i][j] = max(f[i][j], f[f[i][j - 1]][j - 1]);
}
}
int x, y;
while (q--) {
scanf("%d%d", &x, &y);
++x, ++y;
printf("%d\n", work(x, y));
}
}
return 0;
}

Codeforces 1175E Minimal Segment Cover的更多相关文章

  1. CodeForces - 1175E Minimal Segment Cover (倍增优化dp)

    题意:给你n条线段[l,r]以及m组询问,每组询问给出一组[l,r],问至少需要取多少个线段可以覆盖[l,r]区间中所有的点. 如果贪心地做的话,可以求出“从每个左端点l出发选一条线段可以到达的最右端 ...

  2. CF1175E Minimal Segment Cover 题解

    题意:给出\(n\)个形如\([l,r]\)的线段.\(m\)次询问,每次询问区间\([x,y]\),问至少选出几条线段,使得区间\([x,y]\)的任何一个部位都被至少一条线段覆盖. 首先有一个显然 ...

  3. CF1175E Minimal Segment Cover

    题目链接 题意 给出n条线段.m次询问,每次询问给出一个区间\([l,r]\)问最少需要多少条线段才能覆盖区间\([l,r]\). 所有坐标\(\le 5\times 10^5\).\(n,m\le ...

  4. codeforces1175E Minimal Segment Cover 倍增

    题目传送门 题意:给出n条平行于x轴的线段,q次询问,每次询问一个区间最少要几条线段来覆盖,若不能覆盖则输出-1. 思路:先考虑贪心,必定是先找到,所有左端点小于等于$x$的线段的右端点最大在哪里,然 ...

  5. Codeforces 797C - Minimal string

    C. Minimal string 题目链接:http://codeforces.com/problemset/problem/797/C time limit per test 1 second m ...

  6. CodeForces 797C Minimal string:贪心+模拟

    题目链接:http://codeforces.com/problemset/problem/797/C 题意: 给你一个非空字符串s,空字符串t和u.有两种操作:(1)把s的首字符取出并添加到t的末尾 ...

  7. Codeforces 1092E Minimal Diameter Forest

    Minimal Diameter Forest 首先我们找出每个连通块中的特殊点, 特殊点的定义是到各种个连通块中距离的最大值最小的点, 每个连通块肯定通过特殊点连到其他连通块, 我们把有最大值的特殊 ...

  8. Codeforces 825E Minimal Labels - 拓扑排序 - 贪心

    You are given a directed acyclic graph with n vertices and m edges. There are no self-loops or multi ...

  9. Codeforces 1073 E - Segment Sum

    E - Segment Sum 思路: 数位dp 我们平时做的数位dp都是求满足条件的数的个数, 这里要求满足条件的数的和 只要在原来的基础上求每一位的贡献就可以了,所以传参数时要传两个 代码: #p ...

随机推荐

  1. gin mongodb restful api设计: 动态的patch接口

    目录 什么是Patch? Patch方法可以用来更新资源的一个组成部分 什么时候使用Patch? 当你仅需更新资源的某一项,即不完全也不幂等 那当我们的模型在数据库中几乎每个字段都可能会遇到改变的时候 ...

  2. Go语言学习笔记(7)——函数和方法

    Go语言中同时有函数和方法! 函数: go程序必须要包含一个main函数.main函数不能有任何参数和返回值! 1. 定义方法示例: func max(num1, num2 int) int { // ...

  3. S03_CH12_基于UDP的QSPI Flash bin文件网络烧写

    S03_CH12_基于UDP的QSPI Flash bin文件网络烧写 12.1概述 为了满足不同的需求,本例程在"基于TCP的QSPI Flash bin文件网络烧写"上进行修改 ...

  4. 题解-PKUWC2018 猎人杀

    Problem loj2541 题意概要:给定 \(n\) 个人的倒霉度 \(\{w_i\}\),每回合会有一个人死亡,每个人这回合死亡的概率为 自己的倒霉度/目前所有存活玩家的倒霉度之和,求第 \( ...

  5. Mybatis分页的方式以及实现

    方式 分页的分类: 1.物理分页:只从数据库中查询当前页的数据 优点:不占用很多内存   缺点:效率比价低(相比于逻辑分页) 2.逻辑分页:从数据库将所有记录查询出来,存储到内存中,展示当前页,然后数 ...

  6. vue的自定义指令

    点击元素之外触发函数 <template> <div v-clickoutside="clickItemOut"></div> </tem ...

  7. C++ 项目和资源导引

    值得学习的C语言开源项目 注意:本文转载自:https://blog.csdn.net/a110658684/article/details/78862348 - 1. Webbench Webben ...

  8. 转:applicationContext.xml文件放置位置不同而导致的jUnit测试的时候路径的不同

    如果applicationContext.xml文件放置在src下面的的时候使用jUint测试的时候编写的路径应该是这样的: @Test public void saveTest() { Applic ...

  9. AlterDialog对话框的使用

    第一步先写出layout文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xml ...

  10. 线段树lazy模板 luogu3372

    线段树写得很少,这么基本的算法还是要会的…… #include<bits/stdc++.h> using namespace std; inline long long read() { ...