codeforces1175E Minimal Segment Cover 倍增
题意:给出n条平行于x轴的线段,q次询问,每次询问一个区间最少要几条线段来覆盖,若不能覆盖则输出-1.
思路:先考虑贪心,必定是先找到,所有左端点小于等于$x$的线段的右端点最大在哪里,然后答案加一,将$x$挪到这个最大右端点,继续贪心,直到右端点大于$y$。
考虑优化,可以用倍增来加速这个过程,先用初始的线段预处理出所有的$f[i][j]$,代表第i个节点跳跃{2^j}个线段最大能到达多少个右端点,然后倍增搞一下,每次询问的时候,也是二分的跳,每次的时间复杂度都是$log(n)$,总的时间复杂度是$nlog(n)$。
#pragma GCC optimize (2)
#pragma G++ optimize (2)
#pragma comment(linker, "/STACK:102400000,102400000")
#include<bits/stdc++.h>
#include<cstdio>
#include<vector>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,b,a) for(int i=b;i>=a;i--)
#define clr(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define pii pair<int,int >
using namespace std;
typedef long long ll;
const int maxn=;
ll rd()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int f[maxn][],maxx,x,y,n,q;
int fac[];
int main(){
fac[]=;
rep(i,,){
fac[i]=*fac[i-];
}
while(cin>>n>>q){
clr(f,);
rep(i,,n){
scanf("%d%d",&x,&y);
f[x][]=max(f[x][],y);
}
maxx=;
rep(i,,maxx){
f[i][]=max(f[i][],f[i-][]);
if(f[i][]<=i)f[i][]=;
}
// puts("debug");
rep(i,,){
rep(j,,maxx){
if(f[j][i-]!=&&f[f[j][i-]][i-]!=){
f[j][i]=f[f[j][i-]][i-];
}
}
}
while(q--){
scanf("%d%d",&x,&y);
int r=x;
int ans=;
dep(i,,){
if(f[r][i]==)continue;
if(f[r][i]<y){
ans+=fac[i];
r=f[r][i];
}
}
if(f[r][]>=y){
printf("%d\n",ans+);
}else{
puts("-1");
}
}
}
}
codeforces1175E Minimal Segment Cover 倍增的更多相关文章
- CodeForces - 1175E Minimal Segment Cover (倍增优化dp)
题意:给你n条线段[l,r]以及m组询问,每组询问给出一组[l,r],问至少需要取多少个线段可以覆盖[l,r]区间中所有的点. 如果贪心地做的话,可以求出“从每个左端点l出发选一条线段可以到达的最右端 ...
- CF1175E Minimal Segment Cover 题解
题意:给出\(n\)个形如\([l,r]\)的线段.\(m\)次询问,每次询问区间\([x,y]\),问至少选出几条线段,使得区间\([x,y]\)的任何一个部位都被至少一条线段覆盖. 首先有一个显然 ...
- Codeforces 1175E Minimal Segment Cover
题意: 有\(n\)条线段,区间为\([l_i, r_i]\),每次询问\([x_i, y_i]\),问要被覆盖最少要用多少条线段. 思路: \(f[i][j]\)表示以\(i\)为左端点,用了\(2 ...
- CF1175E Minimal Segment Cover
题目链接 题意 给出n条线段.m次询问,每次询问给出一个区间\([l,r]\)问最少需要多少条线段才能覆盖区间\([l,r]\). 所有坐标\(\le 5\times 10^5\).\(n,m\le ...
- Codeforces Edu Round 66 A-E
A. From Hero to Zero 通过取余快速运行第一步即可.由于\(a \% b (a >= b) <= \frac{a}{2}\).所以总复杂度不超过\(O(log_2n)\) ...
- uva.10020 Minimal coverage(贪心)
10020 Given several segments of line (int the X axis) with coordinates [Li, Ri]. You are to choose t ...
- 【区间覆盖问题】uva 10020 - Minimal coverage
可以说是区间覆盖问题的例题... Note: 区间包含+排序扫描: 要求覆盖区间[s, t]; 1.把各区间按照Left从小到大排序,如果区间1的起点大于s,则无解(因为其他区间的左起点更大):否则选 ...
- UVa 10020 - Minimal coverage(区间覆盖并贪心)
Given several segments of line (int the X axis) with coordinates [Li, Ri]. You are to choose the min ...
- UVA 10020 Minimal coverage(贪心 + 区间覆盖问题)
Minimal coverage The Problem Given several segments of line (int the X axis) with coordinates [Li, ...
随机推荐
- Excel_PoweQuery——条件计数、条件求和
岁月不居,时节如流. 时光荏苒,岁月如梭. 前面两段充分体现了博主深厚的文学素养,别和博主争,博主说啥就是啥. 其实,对于大量数据的处理,这几年微软Office做的不单单是2007的时候把Excel的 ...
- Javascript高级程序设计--读书笔记之面向对象(一)
哈哈哈万物皆对象,终于到了js的面向对象篇. 一.属性类型 (1)数据属性 数据属性包含一个数据值的位置,在这个位置可以写入和读取数值,数据属性有四个描述器行为的特性 [[Configurable]] ...
- Linux (ifconfig/docker) 移除网桥/虚拟网卡
今天上大数据实践课时,使用学校提供的云主机平台创建了几台vps,但是安全组配置好之后发现无法用ssh无法登录,ping也不通,提示网络无法到达. 但是拿别人的电脑试了下能顺利使用ssh连接. 有人说是 ...
- Codeforces 1156C 尺取法 / 二分
题意:给你一个数组,问里面最多能匹配出多少对,满足abs(a[i] - a[j]) >= k; 思路:首先肯定要排序. 思路1(尺取法):看了dreamoon的代码明白的.我们可以寻找一个最长的 ...
- 前端学习(八)sass和bootstrap(笔记)
less sass 和less基本上70%差不多(书写方式不一样) sass功能更多一点 1.定义一个变量 $b:blue; div{width:100px;height:100px; backgro ...
- div::before一个能插入元素的选择器
div::before一个能插入元素的选择器
- 转帖 新Eclipse安装与配置
Eclipse的官网地址:http://www.eclipse.org/ 我们下载J2EE版本:Eclipse IDE for Java EE Developers 目前最新版本是:Eclipse K ...
- Java开发常见基础题大全
1.&和&&的区别? &:逻辑与(and),运算符两边的表达式均为true时,整个结果才为true. &&:短路与,如果第一个表达式为false时,第二 ...
- 【NOI2011】兔农(循环节)
我居然没看题解瞎搞出来了? 题解: 不难想到找到每次减1的位置,然后减去它对最终答案的贡献. 假设有一个地方是\(x,1(mod~k)\) 那么减了1后就变成了\(x,0\). 然后可以推到\(x,0 ...
- Yii2数据库操作 事务
Yii2 DAO http://blog.csdn.net/hzqghost/article/details/44116039