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\),然后都一样... 据神仙 ...
随机推荐
- TWaver HTML5之树形布局
转眼间春节假期已经过完,作为一个职业的程序猿,不知道大家有没有这样的感觉,一天不碰电脑,总觉得生活少点什么.今天是春节后上班的第三天,给大家分享一下我们前段时间的一个需求,需求是这样的:界面中的网元分 ...
- relax 网站
1. Calm 网站链接:http://www.calm.com/ 这个网站就像它的名字一样“平和”,网站的设计是通过自然图片(阳光下的暖流.流淌的消息等)与缓缓的音乐相结合,帮你在短时间内即可放松下 ...
- NOIP 2008 传纸条(洛谷P1006,动态规划递推,滚动数组)
题目链接:P1006 传纸条 PS:伤心,又想不出来,看了大神的题解 AC代码: #include<bits/stdc++.h> #define ll long long using na ...
- 06二叉树、Map、Collections、适配器
06二叉树.Map.Collections.适配器-2018/07/16 1.set集合,无索引,不可以重复,无序(存取不一致) 2.TreeSet用来对象元素进行排序,可以保证元素唯一 储存自定义对 ...
- ZOJ - 3985 - String of CCPC (思维 + 暴力)
题意: 询问一共有有多少个CCPC,每个得1分,可以自己在任意位置添加字母,第i次添加需要耗费i-1分 思路: 既然每次添加需要耗分,添加第二个字母,相当于没有添加,所以只需要添加一次就好 先计算出原 ...
- (一)python条件语句和基本数据类型
条件语句 语法一:if...else if <条件成立>: 处理过程 else: 处理过程 语法二:if...elif...else if <条件1成立>: 处理过程1 el ...
- pat甲级 1107. Social Clusters (30)
When register on a social network, you are always asked to specify your hobbies in order to find som ...
- hdu poj KMP简单题目总结
hdu 3336 题意:输入一个字符串求每个前缀在串中出现的次数和 sol:只要稍微理解下next 数组的含义就知道只要把每个有意义的next值得个数加起来即可 PS:网上有dp解法orz,dp[i] ...
- noip模拟赛 whzzt-Warmth
分析:这道题难度和天天爱跑步差不了多少啊......裸的暴力只有10分,最好大的还是那个5%的数据,不过这也才15分,比天天爱跑步的暴力分不知道少到哪里去了. 正解是dp,毕竟要求方案数嘛,但是这个d ...
- Uva122 Trees on the level
Background Trees are fundamental in many branches of computer science. Current state-of-the art para ...