贪心+倍增

首先如果这个问题在序列上,好像可以按右端点排序,然后从起点开始向能到的最远的地方走。

但是环上不可以,因为随即一个起点可能不是最小的。

然后神思路来了:我们先将环展开倍增,再将区间按右端点排序,然后每个区间连向能达到最远的区间连边。因为每个区间只向外连一条边,而且最后一个区间没有后继,所以这是一颗树。(森林不可能吧,因为每个点都被覆盖了,那么每个区间都有后继,到达最后的区间时肯定有会归到最后一个区间)枚举每个区间,向上倍增,因为每个区间的祖先右端点都要大一些,所以只要倍增到自己左端点时就是答案。

#include<bits/stdc++.h>
using namespace std;
const int N = ;
struct cover {
int x, y;
} a[N];
int n, len, ans = << ;
int fa[N][], dep[N], mn[N];
bool cp(cover x, cover y)
{
return x.y < y.y;
}
int query(int x, int limit)
{
for(int i = ; i >= ; --i)
if(fa[x][i] != - && a[fa[x][i]].y < limit)
x = fa[x][i];
return a[x].y >= limit ? x : fa[x][];
}
void getdep(int x)
{
if(dep[x])
return;
if(fa[x][] == -)
{
dep[x] = ;
return;
}
getdep(fa[x][]);
dep[x] = dep[fa[x][]] + ;
}
int main()
{
scanf("%d%d", &len, &n);
for(int i = ; i <= n; ++i)
{
scanf("%d%d", &a[i].x, &a[i].y);
if(a[i].y < a[i].x)
a[i].y += len;
}
sort(a + , a + n + , cp);
int j = ;
memset(fa, -, sizeof(fa));
memset(mn, 0x3f3f, sizeof(mn));
for(int i = n; i; --i)
mn[i] = min(mn[i + ], a[i].x);
for(int i = ; i <= n; ++i)
{
while(a[i].y >= mn[j + ] - && j < n)
++j;
fa[i][] = j == i ? - : j;
}
for(int i = ; i <= n; ++i)
getdep(i);
for(int k = ; k <= ; ++k)
for(int i = ; i <= n; ++i)
if(fa[i][k - ] != -)
fa[i][k] = fa[fa[i][k - ]][k - ];
for(int i = ; i <= n; ++i)
{
int x = query(i, a[i].x + len - );
if(x != -)
ans = min(ans, dep[i] - dep[x] + );
}
if(ans != << )
printf("%d\n", ans);
else
puts("impossible");
return ;
}

bzoj4082的更多相关文章

  1. 【BZOJ-4082】Surveillance 树链剖分 LCA + 贪心

    4082: [Wf2014]Surveillance Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 260  Solved: 100[Submit][ ...

  2. [BZOJ4082][Wf2014]Surveillance[倍增]

    题意 给你一个长度为 \(len\) 的环,以及 \(n\) 个区间,要你选择尽量少的区间,使得它们完全覆盖整个环.问最少要多少个区间. \(len,n\leq 10^6\) . 分析 考虑普通的区间 ...

  3. 倍增&矩阵乘法 专题复习

    倍增&矩阵乘法 专题复习 PreWords 这两个基础算法我就不多说啦,但是还是要介绍一下" 广义矩阵 "乘法 其实就是把矩阵换成取\(max\),然后都一样... 据神仙 ...

随机推荐

  1. vue的自定义指令控制菜单权限

    用户登录后,选择子节点,节点中含有多个菜单,可以根据后台返回的权限数据进行权限控制 在vue上挂载自定义指令方法,根据后台返回权限移除相应节点 import Cookies from "js ...

  2. 「 hihoCoder 1014 」Trie 树

    标题真直接 题目大意 给你 $n$ 个字符串.存到一个字典中.又给你 $m$ 个询问,每个询问给一个字符串,在字典中查出有多少个字符串是以这个字符串为前缀. 解题思路 模板题啊 在每个点设置一个变量 ...

  3. 安迪的第一个字典(Andy's First Dictionary,Uva 10815)

    输入一个文本,找出所有不同的单词(连续的字母序列),按字典序从小到大输出.单 词不区分大小写. 样例输入: Adventures in Disneyland Two blondes were goin ...

  4. UVA-12333 Revenge of Fibonacci(竖式加法模拟 & 字典树)

    题目: 给出一个斐波那契数字的前缀,问第一个有这个前缀的数字在斐波那契数列中是第几个. 思路: 紫书提示:本题有一定效率要求.如果高精度代码比较慢,可能会超时. 利用滚动数组和竖式加法来模拟斐波那契相 ...

  5. Springboot2.0中jpa默认创建的mysql表为myisam引擎问题

    使用Springboot2.0后,使用jpa操作mysql数据库时,默认创建的表的引擎是myisam,myisam是不能加外键的,找了一些资源,最终可以用此方法解决! yml格式: spring: j ...

  6. Oracle 常用目录结构(10g)

    大多数情况下,了解Oracle常用目录结构,将大大提高数据库管理与维护的工作效率,本文介绍了Oracle 10g 的常用目录. OFA: 下面给出Oracle 最优灵活体系结构OFA(Optimal ...

  7. python re模块与正则

    1. re模块 1.1 转义符 正则表达式中的转义符在python的字符串中也刚好有转移的作用,但是正则表达式中的转义符和字符串中的转义符并没关系,且还容易有冲突. 为了避免这种冲突,我们所有的正则都 ...

  8. Jmeter使用笔记之断言

    前言 Jmeter的断言方式有很多种,由于在工作中经常做的是API接口测试,所以这篇文章主要介绍如何对接口的字段进行解析,如何对解析出来的字段的值断言 了解API接口 Restful API 规范 协 ...

  9. LA 3029 City Game

    LA 3029 求最大子矩阵问题,主要考虑枚举方法,直接枚举肯定是不行的,因为一个大矩阵的子矩阵个数是指数级的,因此应该考虑先进行枚举前的扫描工作. 使用left,right,up数组分别记录从i,j ...

  10. BNUOJ 14381 Wavio Sequence

    Wavio Sequence Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. Origina ...