bzoj4082
贪心+倍增
首先如果这个问题在序列上,好像可以按右端点排序,然后从起点开始向能到的最远的地方走。
但是环上不可以,因为随即一个起点可能不是最小的。
然后神思路来了:我们先将环展开倍增,再将区间按右端点排序,然后每个区间连向能达到最远的区间连边。因为每个区间只向外连一条边,而且最后一个区间没有后继,所以这是一颗树。(森林不可能吧,因为每个点都被覆盖了,那么每个区间都有后继,到达最后的区间时肯定有会归到最后一个区间)枚举每个区间,向上倍增,因为每个区间的祖先右端点都要大一些,所以只要倍增到自己左端点时就是答案。
#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的更多相关文章
- 【BZOJ-4082】Surveillance 树链剖分 LCA + 贪心
4082: [Wf2014]Surveillance Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 260 Solved: 100[Submit][ ...
- [BZOJ4082][Wf2014]Surveillance[倍增]
题意 给你一个长度为 \(len\) 的环,以及 \(n\) 个区间,要你选择尽量少的区间,使得它们完全覆盖整个环.问最少要多少个区间. \(len,n\leq 10^6\) . 分析 考虑普通的区间 ...
- 倍增&矩阵乘法 专题复习
倍增&矩阵乘法 专题复习 PreWords 这两个基础算法我就不多说啦,但是还是要介绍一下" 广义矩阵 "乘法 其实就是把矩阵换成取\(max\),然后都一样... 据神仙 ...
随机推荐
- ansible结合playbook批量部署war包项目上线
批量部署jenkins.war包实现上线 用于测试war包上线 [root~localhost]~#vim /etc/ansible/test.yml - hosts: test vars: ...
- 查询条件中,不进sql语句 也不进后台bug
前端代码:本来代码中少写了value="1",后来加上value值之后,可以正常进方法 <div class="row"> <label cl ...
- 微服务网关从零搭建——(七)更改存储方式为oracle
资源准备: 下载开源项目 新建oracle表: -- ---------------------------- -- Table structure for OcelotGlobalConfigura ...
- Java基础——接口
一:接口,英文称作interface,在软件工程中,接口泛指供别人调用的方法或者函数. 在封装与接口中,private关键字封装了对象的内部成员.经过封装,产品隐藏了内部细节,只提供给用户接口(int ...
- (C/C++学习)21.C++中返回引用和返回对象以及传引用和传对象问题
说明:在学习和编写C++代码时,经常会遇到这样的问题:一个带返回值的函数,到底应该返回值呢,还是应该返回引用呢:在传递参数的时候,是应该传递参数的引用呢,还是应该传值呢?请看下面代码: void my ...
- 长久不用的mysql报错ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
mac上安装过mysql: 然而,尝试连接时报错: $ mysql -u root -p Enter password: ERROR 2002 (HY000): Can't connect to lo ...
- Django-REST-Framework JWT 实现SSO认证(上)
一.什么是Django-REST-Framework? Django-REST-framework 是基于Django框架的一个web RESTful风格开发的框架,它可以实现API接口的快速开发,但 ...
- [bzoj4567][Scoi2016][背单词] (贪心+trie树)
Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计 ...
- Spark在Executor上的内存分配
spark.serializer (default org.apache.spark.serializer.JavaSerializer ) 建议设置为 org.apache.spark.ser ...
- COJ 1351 Tree Counting 动态规划
题目大意是: 给定一个n,k,表示树上共有n个节点,每个节点最多有k个叶子,问一共多少种摆法,答案对1000000007取模 这里定义一个dp[i]表示 i 个节点对应有多少种方法 f[i][j] 表 ...