【bzoj4444】[Scoi2015]国旗计划 倍增

题目描述

给出一个圈和若干段,问:对于所有的 $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;
}

 

转载于:https://www.cnblogs.com/GXZlegend/p/8029235.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428471.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java multimap 序列化_C++ JSON库的使用

1. 如何使用&#xff1f;2. 常用方法2.1 创建json对象2.1.1 使用cin,cout输入输出流2.1.2 提供根据键直接生成键值对的方法2.1.3 json::array json::object2.1.4 几个区别2.2 序列化2.2.1 标准输出自动序列化2.2.2 使用dump()函数2.3 反序列化2.3.1 从标准输入反序列化2.3.2 通…

【Excle数据透透视表】如何删除数据透视表

选中区域A4:C17,在键盘上按DELETE键删除&#xff0c;结果提示&#xff1a;那么如何删除呢&#xff1f;解决方案选中整个数透视表&#xff0c;再删除具体操作&#xff1a;选中整个数据透视表→DELETE注意&#xff1a;删除之后&#xff0c;源数据不会受到影响转载于:https://www.…

java 启动redis服务器_docker启动redis并使用java连接

一、先查找镜像docker search redis二、拉取镜像docker pull redis三、等待拉取完毕四、查看拉去的镜像docker iamges五、运行redis连接1&#xff1a;https://blog.csdn.net/weixin_38956287/article/details/80423607连接2&#xff1a;http://www.runoob.com/docker/docker-in…

【算法学习】整体二分

我们开门见山&#xff0c;讲讲一道sb题&#xff1a; 给你一个数组&#xff0c;查这个数组的第x大元素。 排序&#xff1f;可以 二分&#xff1f;怎么做啊&#xff1f; 二分出一个mid&#xff0c;判断这个数组中有多少个数小于等于mid&#xff0c;如果个数大于等于x&#xff0c;…

mysql leave的作用_MySQL数据库中DELIMITER的作用

以下的文章主要是向大家描述的是MySQL数据库中delimiter的作用是什么?我们一般都认为这个命令和存储过程关系不大&#xff0c;到底是不是这样的呢&#xff1f;以下的文章将会给你相关的知识&#xff0c;望你会有所收获。下面是一个存储过程的实例&#xff1a;DELIMITER $$USE …

Fullpage参数说明

参数说明 $(document).ready(function() {$(#fullpage).fullpage({//Navigationmenu: false,//绑定菜单&#xff0c;设定的相关属性与anchors的值对应后&#xff0c;菜单可以控制滚动&#xff0c;默认为false。anchors:[firstPage, secondPage],//anchors定义锚链接&#xff0c…

mysql100个优化技巧_完整篇:100+个MySQL调试和优化技巧(2)

▼MySQL模式优化51.检查和经常优化表.52. 经常重写InnoDB表优化.53. 有时&#xff0c;当添加列时删除索引&#xff0c;然后在添加回来索引&#xff0c;这样就会更快.54. 针对不同的需求&#xff0c;使用不同的存储引擎.55. 使用归档存储引擎日志表或审计表-这是更有效地写道.56…

Java Swing

编辑中... 转载于:https://www.cnblogs.com/startup-try/p/8040625.html

包装类java_Java 包装类

也叫过滤流类处理刘类没有对应到任何具体的流设备&#xff0c;需要给它传递一个对应的具体流设备的输出/输入流对象I/0内存缓冲BufferedInputStream,BufferedOutputStream 缓冲区包装类 默认32个字节缓冲区的缓冲流内存/磁盘扇区一次读写操作所能完成最大字节数的整数倍(4的整数…

简单的SQL注入学习

引贴&#xff1a; http://blog.163.com/lucia_gagaga/blog/static/26476801920168184648754/ 首先需要编写一个php页面&#xff0c;讲php页面放入/opt/lampp/htdocs目录下&#xff1a; 解释一下这个页面&#xff1a; 1.通过if语句判断变量是否初始化 2.if语句中通过mysql_conne…

vb红绿灯自动切换_VB红绿灯程序

《VB红绿灯程序》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《VB红绿灯程序(4页珍藏版)》请在人人文库网上搜索。1、VB红绿灯演示Private Sub Command1_Click()While (1)Shape1.FillColor RGB(255, 0, 0)Shape2.FillColor RGB(0, 0, 0)Shape3.FillColor RGB(0, …

什么是网站监控?

网站监控是跟踪网站的可用性和性能&#xff0c;以最小化宕机时间&#xff0c;优化性能并确保顺畅的用户体验。维护网站正常运行对于任何企业来说都是至关重要的&#xff0c;因而对大多数业务来说&#xff0c;网站应用监控都是一个严峻的挑战。Applications Manager网站应用监控…

循序渐进PYTHON3(十三) --4-- DJANGO之CSRF使用

用 django 有多久&#xff0c;跟 csrf 这个概念打交道就有久。 每次初始化一个项目时都能看到 django.middleware.csrf.CsrfViewMiddleware 这个中间件每次在模板里写 form 时都知道要加一个 {% csrf_token %} tag每次发 ajax POST 请求&#xff0c;都需要加一个 X_CSRFTOKEN 的…

java string replace 重载_关于Java:如何使用replace(char,char)替换字符b的所有实例为空...

如何使用replace(char&#xff0c;char)将字符" b"的所有实例全部替换为空。例如&#xff1a;Hambbburger to Hamurger编辑&#xff1a;有一个约束&#xff0c;我只能使用1.4.2&#xff0c;这意味着没有重载版本的replace&#xff01;你不能因为什么都不是字符&#…

JavaScript——执行环境、变量对象、作用域链

前言 这几天在看《javascript高级程序设计》&#xff0c;看到执行环境和作用域链的时候&#xff0c;就有些模糊了。书中还是讲的不够具体。通过上网查资料&#xff0c;特来总结&#xff0c;以备回顾和修正。 目录&#xff1a; EC(执行环境或者执行上下文&#xff0c;Execution …

java线程interrupt用法_Java 如何中断线程

本篇文章帮大家学习java 如何中断线程&#xff0c;包含了Java 如何中断线程使用方法、操作技巧、实例演示和注意事项&#xff0c;有一定的学习价值&#xff0c;大家可以用来参考。以下实例演示了如何使用interrupt()方法来中断线程并使用 isInterrupted() 方法来判断线程是否已…

laravel5.4之artisan使用总结一

Artisan是laravel自带的命令行接口&#xff1a; php artisan list 编写命令 生成命令&#xff1a; 可以使用Artisan命令&#xff0c;php artisan make:command ConsoleTest 执行完这个命令后&#xff0c;会在app/Console/Commands 目录下创建ConsoleTest命令类。会包含默认的属…

java如何保证类不被回收_垃圾回收机制保证了Java程序不会出现内存溢出。( )

【简答题】1.激素(名词解释)【单选题】6.下列哪种情况下可引起ADH分泌增加【判断题】在Java中使用String类型的实例对象表示一个字符串。( )【判断题】static关键字可以修饰成员变量,也可以修饰局部变量。( )【单选题】建设项目投资控制应贯穿于建设工程全过程,在建设项目实施阶…

intellij idea 分屏设置 与快捷键

1、找到分屏功能 File -> setting -> keymap&#xff0c;搜索&#xff08;注意大小写&#xff09;&#xff1a;   Split Vertically 水平分屏   Split Horizontally 垂直分屏 2、设置快捷键&#xff0c; 编辑快捷键的地方在搜索框同一行&#xff1a;    在标签上直…

java parseexception_Java ParseException类代码示例

import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException; //导入依赖的package包/类Overridepublic void read(File file) throws IOException {try {Document doc db.parse(file);NodeList nlTimeSlots (NodeList) xp.evaluate("/ANNOTATION_DOCU…