贪心+倍增

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

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

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

#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. 02Microsoft SQL Server 安装,卸载,系统服务,系统组件及系统数据库

    Microsoft SQL Server 安装,卸载,系统服务,系统组件及系统数据库 1. Microsoft SQL Server 安装 通过单击下拉框,选择浏览,然后在Active Directo ...

  2. C++ Primer(第4版)-学习笔记-第5部分:高级主题

    第17章  用于大型程序的工具 异常处理 不存在数组或函数类型的异常.相反,如果抛出一个数组,被抛出的对象转换为指向数组首元素的指针,类似地,如果抛出一个函数,函数被转换为指向该函数的指针. 不要抛出 ...

  3. POJ3616 Milking Time【dp】

    Description Bessie is such a hard-working cow. In fact, she is so focused on maximizing her producti ...

  4. 在mac上面运行cherrytree

    下载源码包 wget http://www.giuspen.com/software/cherrytree-0.38.4.tar.xz 解压 tar -xvf cherrytree-0.38.4.ta ...

  5. gdb个人使用记录

    参考博客:https://blog.csdn.net/zdy0_2004/article/details/80102076 安装gdb,查看版本确认成功: sudo apt install gdb g ...

  6. JavaScript学习总结(12)——2016 年 7 个顶级 JavaScript 框架

    当涉及到Web开发时,JavaScript框架往往是一些开发人员和企业最受欢迎的平台.可能,你有机会尝试过一两个顶级的JavaScript框架,但你仍然有点不确定哪个才是最佳的最值得掌握的,或者哪个值 ...

  7. Spring MVC学习总结(8)——Swagger入门详解

    前言 Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件.本文简单介绍了在项目中集成swagger的方法和一些常见问题.如果想深入分析项目源码,了解更多内容,见参考资料. S ...

  8. UVA 12686 Trending Topic

    Trending Topic Time limit: 1.000 seconds Imagine you are in the hiring process for a company whose p ...

  9. CodeForces 220B(B. Little Elephant and Array)

    http://codeforces.com/contest/220/problem/B 题意:给出一个数组,给出m组询问,问区间中出现a[i] 次的有多少个. sl: 很显然的离线问题了. 大视野菜花 ...

  10. N的阶乘 mod P

    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 输入N和P(P为质数),求N! Mod P = ? (Mod 就是求模 %)   例如:n = 10, P = 11,10 ...