题目描述

给出一个圈和若干段,问:对于所有的 $i$ ,选择第 $i$ 段的情况下,最少需要选择多少段(包括第 $i$ 段)能够覆盖整个圈?

输入

第1行,包含2个正整数N,M,分别表示边防战士数量和边防站数量。
随后n行,每行包含2个正整数。其中第i行包含的两个正整数Ci、Di分别表示i号边防战士常驻的两个边防站编号,
Ci号边防站沿顺时针方向至Di号边防站力他的奔袭区间。数据保证整个边境线都是可被覆盖的。

输出

输出数据仅1行,需要包含n个正整数。其中,第j个正整数表示j号边防战士必须参加的前提下至少需要
多少名边防战士才能顺利地完成国旗计划

样例输入

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]国旗计划 倍增的更多相关文章

  1. [BZOJ4444][SCOI2015]国旗计划(倍增)

    链上是经典贪心问题,将线段全按左端点排序后把点全撒在线段右端点上.这里放到环上,倍长即可. 题目保证不存在区间包含情况,于是有一种暴力做法,先将战士的管辖区间按左端点从小到大排序,对于询问x,从x战士 ...

  2. [BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增)

    [BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增) 题面 题面较长,略 分析 首先套路的断环为链.对于从l到r的环上区间,若l<=r,我们 ...

  3. BZOJ4444 SCOI2015国旗计划(贪心+倍增)

    链上问题是一个经典的贪心.于是考虑破环成链,将链倍长.求出每个线段右边能作为后继的最远线段,然后倍增即可. #include<iostream> #include<cstdio> ...

  4. 2019.03.26 bzoj4444: [Scoi2015]国旗计划(线段树+倍增)

    传送门 题意简述:现在给你一个长度为mmm的环,有nnn条互不包含的线段,问如果强制选第iii条线段至少需要用几条线段覆盖这个环,注意用来的覆盖的线段应该相交,即[1,3],[4,5][1,3],[4 ...

  5. BZOJ4444 : [Scoi2015]国旗计划

    首先将坐标离散化,因为区间互不包含,可以理解为对于每个起点输出最少需要多少个战士. 将环倍长,破环成链,设$f[i]$表示区间左端点不超过$i$时右端点的最大值,可以通过$O(n)$递推求出. 那么如 ...

  6. [BZOJ4444][SCOI2015]国旗计划-[ST表]

    Description 传送门 Solution 说真的这道题在场上没做出来的我必定是脑子有洞.. 我们用st表记录以某个位置开始,派了1<<j个战士能到达的最远位置. 由于边境线是一圈, ...

  7. 【BZOJ4444】[Scoi2015]国旗计划 双指针+倍增

    [BZOJ4444][Scoi2015]国旗计划 Description A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形 ...

  8. [SCOI2015]国旗计划[Wf2014]Surveillance

    [SCOI2015]国旗计划 A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这 项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名 ...

  9. 4444: [Scoi2015]国旗计划

    4444: [Scoi2015]国旗计划 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 485  Solved: 232 Description A国 ...

随机推荐

  1. COGS:1822. [AHOI2013]作业

    1822. [AHOI 2013] 作业 ★★★   输入文件:ahoi2013_homework.in   输出文件:ahoi2013_homework.out   简单对比时间限制:20 s   ...

  2. eclipse+tomcat配置远程debug调整

    由于开发环境与真实服务器环境存在差异,有时开发时明明正常的逻辑,部署之后就会出现各种各样的问题,通过日志邮不能明确定位到问题的时候,可以采用远程debug调试来定位问题.下面就介绍一下具体的配置步骤: ...

  3. Linux tcpdump命令详解(分享文章)

    简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...

  4. 微信小程序学习笔记(四)

    云函数条件查询 exports.main = async (event, context) => { try { return await db.collection('sweething'). ...

  5. VS Help Viewer 显示内容为HTML源码的问题

    万恶的IE10 为了学习,安装了一套Windows Server 2012+SQL 2012+VS 2012的环境,整体感觉还不错,只是在使用Help Viewer查看帮助的时候,发现显示内容居然为H ...

  6. Uncaught Error: code length overflow. (1604>1056)

    解决方法来源~~~https://blog.csdn.net/arrowzz/article/details/80656510 二维码生成时,如果长度太长会有异常: Uncaught Error: c ...

  7. Python全栈 正则表达式(re模块正则接口全方位详解)

    re模块是Python的标准库模块 模块正则接口的整体模式 re.compile 返回regetx对象 finditer fullmatch match search 返回 match对象 match ...

  8. python 终极篇 --- form组件 与 modelForm

                                                           form组件                                       ...

  9. [Clr via C#读书笔记]Cp17委托

    Cp17委托 简单介绍 delegate回调函数机制,可以理解存储函数地址的变量类型: 类型安全: 引用类型支持逆变和协变: 回调 静态方法,实例方法 委托的本质 所有的委托都派生自System.Mu ...

  10. vector:动态数组

    vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确.它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存 ...