贪心+倍增

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

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

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

#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. BZOJ3124: [Sdoi2013]直径 (树形DP)

    题意:给一颗树 第一问求直径 第二问求有多少条边是所有直径都含有的 题解:求直径就不说了 解第二问需要自己摸索出一些性质 任意记录一条直径后 跑这条直径的每一个点  如果以这个点不经过直径能到达最远的 ...

  2. 数据类型对应字节数(32位,64位 int 占字节数)

    数据类型对应字节数(32位,64位 int 占字节数) 可用如sizeof(char),sizeof(char*)等得出 32位编译器: char :1个字节 char*(即指针变量): 4个字节(3 ...

  3. 「 COGS 2240 」 X 「 Luogu P2885 」 架设电话线

    解题思路 首先很容易就想到了一个二维的朴素的 $dp$. 设 $dp[i][j]$ 表示第 $i$ 个位置的电话线杆的高度为 $j$ 时的最小花费,就需要枚举第 $i$ 个电话线杆.第 $i$ 个电话 ...

  4. NOIP2016 DAY1 T2天天爱跑步

    传送门 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 ...

  5. swing之单选框和复选框

    import java.awt.Container; import java.awt.GridLayout; import javax.swing.*; public class num_1v ext ...

  6. kata练习题

    This time no story, no theory. The examples below show you how to write function accum: Examples: ac ...

  7. 洛谷 4364 [九省联考2018]IIIDX

    [题解] 一眼可以想到一个类似二叉树后序遍历的贪心做法,然而这个做法在有相同数字的情况下是错误的.最简单的反例就是n=4,d={1,1,1,2},正解是1,1,2,1,而贪心是1,1,1,2. 所以这 ...

  8. JavaSE 学习笔记之包装类(十七)

    基本数据类型对象包装类:是按照面向对象思想将基本数据类型封装成了对象. 好处: 1:可以通过对象中的属性和行为操作基本数据. 2:可以实现基本数据类型和字符串之间的转换. 关键字   对应的类名 by ...

  9. ansible playbooks loop循环

    在一个task中循环某个操作 1.标准循环 - name: add several users user: name: "{{ item }}" state: present gr ...

  10. [luoguP1111] 修复公路(并查集)

    传送门 呵呵的最小生成树 ——代码 #include <cstdio> #include <iostream> #include <algorithm> #defi ...