【bzoj4444】[Scoi2015]国旗计划 倍增
题目描述
输入
输出
样例输入
4 8
2 5
4 7
6 1
7 3
样例输出
3 3 4 3
题解
倍增
如果将选择的区间按照右端点正方向顺序考虑的话,那么如果选择了某个区间,下一个区间的选择一定是所有左端点小于等于该区间右端点中,右端点最靠后的那一个。
因此首先断环成链,然后选择区间 $[l,r]$ 后,下一个选择就应该是左端点在 $[1,r]$ 范围内,右端点最靠后的。
所以对于每一个区间 $[l,r]$ ,在 $l$ 位置上加入 $r$ ,然后求前缀最大值即可得到每个位置选上一个区间后最远能够覆盖到哪。
我们要求的是覆盖整个圈,因此可以考虑倍增算法,预处理出 $f[i][j]$ 表示从 $j$ 位置选择 $2^i$ 段区间最远能够覆盖到哪。那么上面的全椎最大值就是 $f[0][j]$ 。
根据递推式 $f[i][j]=f[i-1][f[i-1][j]]$ 预处理出 $f$ 数组,然后倍增求解。从大到小枚举 $i$ ,如果加入一段不能覆盖整个圈则加入,否则不加入。最后加上2(本身+无限逼近后剩余的一段)即为答案。
注意一下区间跨越 $m$ 的处理 ,详见代码。
时间复杂度 $O(n\log n)$
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 200010
#define pos(x) lower_bound(v + 1 , v + m + 1 , x) - v
using namespace std;
int a[N] , b[N] , v[N << 1] , f[20][N << 2];
int main()
{
int n , m = 0 , i , j , t , ans;
scanf("%d%*d" , &n);
for(i = 1 ; i <= n ; i ++ ) scanf("%d%d" , &a[i] , &b[i]) , v[++m] = a[i] , v[++m] = b[i];
sort(v + 1 , v + m + 1);
for(i = 1 ; i <= n ; i ++ )
{
a[i] = pos(a[i]) , b[i] = pos(b[i]);
if(a[i] < b[i])
{
f[0][a[i]] = max(f[0][a[i]] , b[i]);
f[0][a[i] + m] = max(f[0][a[i] + m] , b[i] + m);
}
else
{
f[0][1] = max(f[0][1] , b[i]);
f[0][a[i]] = max(f[0][a[i]] , b[i] + m);
f[0][a[i] + m] = max(f[0][a[i] + m] , m << 1);
}
}
for(i = 1 ; i <= m << 1 ; i ++ ) f[0][i] = max(f[0][i] , f[0][i - 1]);
for(t = 1 ; (1 << t) <= m << 1 ; t ++ )
for(i = 1 ; i <= m << 1 ; i ++ )
f[t][i] = f[t - 1][f[t - 1][i]];
for(i = 1 ; i <= n ; i ++ )
{
ans = 0;
if(a[i] < b[i]) a[i] += m;
for(j = t - 1 ; ~j ; j -- )
if(f[j][b[i]] < a[i])
ans += (1 << j) , b[i] = f[j][b[i]];
printf("%d" , ans + 2);
if(i < n) printf(" ");
}
return 0;
}
【bzoj4444】[Scoi2015]国旗计划 倍增的更多相关文章
- [BZOJ4444][SCOI2015]国旗计划(倍增)
链上是经典贪心问题,将线段全按左端点排序后把点全撒在线段右端点上.这里放到环上,倍长即可. 题目保证不存在区间包含情况,于是有一种暴力做法,先将战士的管辖区间按左端点从小到大排序,对于询问x,从x战士 ...
- [BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增)
[BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增) 题面 题面较长,略 分析 首先套路的断环为链.对于从l到r的环上区间,若l<=r,我们 ...
- BZOJ4444 SCOI2015国旗计划(贪心+倍增)
链上问题是一个经典的贪心.于是考虑破环成链,将链倍长.求出每个线段右边能作为后继的最远线段,然后倍增即可. #include<iostream> #include<cstdio> ...
- 2019.03.26 bzoj4444: [Scoi2015]国旗计划(线段树+倍增)
传送门 题意简述:现在给你一个长度为mmm的环,有nnn条互不包含的线段,问如果强制选第iii条线段至少需要用几条线段覆盖这个环,注意用来的覆盖的线段应该相交,即[1,3],[4,5][1,3],[4 ...
- BZOJ4444 : [Scoi2015]国旗计划
首先将坐标离散化,因为区间互不包含,可以理解为对于每个起点输出最少需要多少个战士. 将环倍长,破环成链,设$f[i]$表示区间左端点不超过$i$时右端点的最大值,可以通过$O(n)$递推求出. 那么如 ...
- [BZOJ4444][SCOI2015]国旗计划-[ST表]
Description 传送门 Solution 说真的这道题在场上没做出来的我必定是脑子有洞.. 我们用st表记录以某个位置开始,派了1<<j个战士能到达的最远位置. 由于边境线是一圈, ...
- 【BZOJ4444】[Scoi2015]国旗计划 双指针+倍增
[BZOJ4444][Scoi2015]国旗计划 Description A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形 ...
- [SCOI2015]国旗计划[Wf2014]Surveillance
[SCOI2015]国旗计划 A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这 项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名 ...
- 4444: [Scoi2015]国旗计划
4444: [Scoi2015]国旗计划 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 485 Solved: 232 Description A国 ...
随机推荐
- OI生涯回忆录(一)
OI生涯彻底结束了(难道不是早就结束了),有些东西不写可能就忘了,还是记录一下一些回忆叭.比较墨迹所以可能就连载了. (一)高一开学到NOIP2016 最开始就是觉得信息(计算机)竞赛可能会很有意思就 ...
- [AGC011F] Train Service Planning [线段树优化dp+思维]
思路 模意义 这题真tm有意思 我上下楼梯了半天做出来的qwq 首先,考虑到每K分钟有一辆车,那么可以把所有的操作都放到模$K$意义下进行 这时,我们只需要考虑两边的两辆车就好了. 定义一些称呼: 上 ...
- Java:String、StringBuffer、StringBuilder
一.String 1. String类是final类,意味着String类不能被继承,它的成员方法都默认为final方法.在早期的JVM版本中,被final修饰的方法会转为内嵌调用来提升执行效率.从J ...
- 全新Ubuntu-13.04安装配置redmine
1. apt-get install vim apache2 libapache2-mod-passenger ruby rubygems libruby ruby-dev libmagickc ...
- hdu1907John(反nim博弈)
John Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submis ...
- Selenium 入门到精通系列:六
Selenium 入门到精通系列 PS:Checkbox方法 例子 HTML: <html> <head> <title>测试页面</title> &l ...
- Siki_Unity_0_Unity A计划直播视频
Unity A计划直播视频 2017-07-04直播 任务1:如何识别以招聘来招培训生的公司: 打着招聘的旗号帮培训机构找培训生 关键词:实训生 任务2:如何识别一个公司的好坏和规模大小: 猎聘(中高 ...
- java代码读取yarn聚合目录日志
可以直接使用org.apache.hadoop.yarn.client.cli.LogsCLI(yarn logs -applicationId)中的main方法逻辑,如 public static ...
- python SyntaxError: Non-ASCII character '\xe8' in file C:\Users\nwpujun\PycharmProjects\projects\hrl1\hrlAgent\src\li_nn.py on line 52
解决方法:在文件头部加上这样的一句话 # -*- coding: utf-8 -*- 注意:加在其他的位置可能没用,我就是这样的
- opencv-学习笔记(2)
opencv-学习笔记(2) 这章记录了 获取像素点,改变像素点 获取图像的属性(行,列,通道数,数据类型) roi感应区 拆分以及合并图像通道 边缘扩充 opencv获取像素点,改变像素点 ---- ...