[CEOI2023] A Light Inconvenience 题解

news/2024/11/14 8:58:28/文章来源:https://www.cnblogs.com/Scarab/p/18542654

Description

今年 CEOI 的开幕式上有一场精彩的火炬表演。表演者们站成一排,从 \(1\) 开始从左往右编号。每个表演者举着一根火炬,初始只有一个举着点燃的火炬的表演者。

表演分为 \(Q\) 幕。在第 \(a\) 幕开始之前,要么 \(p_a > 0\) 个表演者从右侧加入表演,他们的火炬是熄灭的;要么最右侧 \(p_a > 0\) 个表演者决定离开,并熄灭他们的火炬(如果他们的火炬是点燃的)。表演者的加入和离开不受委员会的控制。最左侧的表演者永远留在台上。

一旦第 \(a\) 幕准备好了,委员会需要宣布一个非负整数 \(t_a \geq 0\)。对于每个举着点燃的火炬的表演者,用他的火炬点燃他右侧 \(t_a\) 个人的火炬。也就是说,第 \(i\) 个人的火炬在传火后是点燃的,当且仅当表演者 \(\max(1, i - t_a), \cdots, i\) 中至少一个人的火炬在传火前是点燃的。\(t_a\) 不应超过 \(p_a\)

在第 \(a\) 幕结束时,委员会需要告知每个举着点燃的火炬的表演者是否熄灭火炬。出于美学原因,最右侧的表演者应保持他的火炬点燃。此外,为了节省汽油,点燃的火炬数量不应超过 \(150\)

编写程序帮助委员会在上述限制下主持表演。

对于所有数据,\(1\leq N\leq 10 ^ {17}\)\(1\leq Q\leq 5\times 10 ^ 4\)

Solution

考虑将整个 01 序列反转,转化为从开头加/删数。

设序列中第 \(i\)\(1\) 的位置为 \(f_i\),当 \(p=f_i\) 时就需要满足 \(f_i+1\leq f_{i+1}\leq 2f_i+1\),同时 \(f_1=1,f_t=n\)。所以如果没有删除操作,就让 \(f_i=\min\{2f_{i-1}+1,n\}\) 即可。

加入删除操作就不好做了,因为删掉开头的 \(p\) 个数后 \(f\) 数组的形态会变得很不固定,难以维护。

不妨设 \(g\) 数组为删除操作后的新的 \(1\) 的位置序列,考虑用原来的 \(f\) 序列构造 \(g\) 序列。

显然 \(g_{i-1}+1\leq g_i\leq 2g_{i-1}+1\),由于 \(f_j\) 控制的区间为 \([f_j-2p,f_j-p]\),所以所有 \(g_i\) 一定要出自这些区间。

假设已经构造好了 \(g_1,g_2,\ldots,g_{i-1}\),设 \(j\) 为满足 \(f_j-2p\leq 2g_{i-1}+1\) 的最大的 \(j\),那么 \(2f_j+1-2p\geq f_{j+1}-2p>2g_{i-1}+1\),即 \(f_j-p\geq g_{i-1}+1\),所以 \([f_j-2p,f_j-p]\)\([g_{i-1}+1,2g_{i-1}+1]\) 一定有交,贪心地令 \(g_i\)\(\min\{f_j-p,2g_{i-1}+1\}\) 即可。

下面算一下这个做法维护的序列长度。

如果 \(g_i=2g_{i-1}+1\),则 \(g\) 翻倍了。如果 \(g_i=f_j-p\),则 \(2g_i+1=2f_j-2p+1\geq f_{j+1}-2p\),所以 \(g_{i+1}\geq\min\{f_{j+1}-p,2g_i+1\}\)。如果 \(g_{i+1}=2g_i+1\),则 \(g\) 翻倍了,否则 \(g_{i+1}=f_{j+1}-p\geq 2g_{i-1}+1\)

所以 \(g\) 数组每两个就会翻一次倍,所以长度为 \(2\log n+O(1)\)

Code

#include <bits/stdc++.h>
#include "light.h"#ifdef ORZXKR
#include "sample_grader.cpp"
#endifconst int kMaxt = 155;int64_t n = 1, t = 0;
int64_t f[kMaxt], g[kMaxt];void prepare() {n = 1;f[t = 1] = 1;
}std::pair<long long, std::vector<long long>> join(long long p) {if (f[t] == n) --t;if (!t) f[t = 1] = 1;n += p;for (;;) {if (f[t] == n) break;f[t + 1] = std::min<int64_t>(2ll * f[t] + 1, n);++t;}std::vector<long long> vec;for (int i = t; i; --i) vec.emplace_back(n + 1 - f[i]);return {p, vec};
}std::pair<long long, std::vector<long long>> leave(long long p) {n -= p;int _t = 0;g[_t = 1] = 1;for (int i = 1;;) {if (g[_t] == n) break;for (; i < t && f[i + 1] - 2ll * p <= 2ll * g[_t] + 1; ++i) {}g[_t + 1] = std::min<int64_t>({n, f[i] - p, 2ll * g[_t] + 1});++_t;}t = _t;for (int i = 1; i <= t; ++i) f[i] = g[i];std::vector<long long> vec;for (int i = t; i; --i) vec.emplace_back(n + 1 - f[i]);return {p, vec};
}

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

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

相关文章

多校A层冲刺NOIP2024模拟赛21

多校A层冲刺NOIP2024模拟赛21\(T1\) A. 送信卒 \(90pts/100pts\)部分分\(90pts\)设最后的可能的最短路中左右共移动了 \(d\) 次,上下共移动了 \(x\) 次。则等价于求 \(\min \{ x_{i}k+d_{i} \}=s\) 的解,观察到 \(d \in [0,\min(\left\lceil \frac{nm}{2} \right\rceil,s)]\)…

[论文阅读] ZePo: Zero-Shot Portrait Stylization with Faster Sampling

写在前面 原文:ZePo GitHub:Github ZePo 关键词:肖像风格化、扩散模型、零样本快速生成 阅读理由:对扩散模型的改进,可以实现零样本快速生成图像,学习一下思路以及实验设计 前置知识:LCM以及GithubLCM(找时间写一下),可参考LCM&CM,一致性蒸馏、图像质量评价速览…

2024.11.12 鲜花

P11270 【MX-S5-T4】魔法少女们 题解这世界那么多人 这世界有那么多人 人群里 敞着一扇门 我迷朦的眼睛里长存 初见你蓝色清晨 这世界有那么多人 多幸运 我有个我们 这悠长命运中的晨昏 常让我 望远方出神 灰树叶飘转在池塘 看飞机轰的一声去远乡 光阴的长廊 脚步声叫嚷 灯一亮…

Java代码实现行列转换

本代码想要达到的效果 测试完整代码如下(copy直接运行): public class TestConvert { public static void main(String[] args) { ArrayList<Attribute> sourceList = new ArrayList<>(); for (int i = 0; i < 3; i++) { for (i…

SS241112A. 定向越野(walk)

这道题目要求找到从起点出发遍历所有点并回到起点的最小路径长度,路径必须直角拐弯。文章证明了答案是有理数,并通过直观分析和大胆猜测得出初始方向必须是某一个向量的方向,最终使用状压 DP 解决问题,时间复杂度为 $O(n^4 2^n)$。SS241112A. 定向越野(walk) 题意 给你 \…

第六课 Python之模块

一、模块的介绍 (1)python模块,是一个python文件,以一个.py文件,包含了python对象定义和pyhton语句 (2)python对象定义和python语句 (3)模块让你能够有逻辑地组织你的python代码段。 (4)把相关的代码分配到一个模块里能让你的代码更好用,更易懂 (5)模块能定义函数…

redis集群搭建 - cluster模式

搭建一套redis cluster集群。概述 搭建一套redis cluster集群。架构 192.168.0.21:6379 主 192.168.0.23:6380 从 192.168.0.22:6379 主 192.168.0.21:6380 从 192.168.0.23:6379 主 192.168.0.22:6380 从 修改这三台服务器的host文件(选做) vim /etc/hosts192.168.0.21 node…

推荐一个Elasticsearch ES可视化客户端工具:ES-King

ES-King:开源免费,一个现代、实用的ES GUI客户端,支持多平台。 下载地址:https://github.com/Bronya0/ES-King 功能清单 详尽的集群信息:节点信息、堆内存占用、总内存占用、cpu占用、磁盘占用、网络流量、节点角色、集群健康、5分钟负载、每个节点的字段缓存、段缓存、查…

Kafka怎么配置SASL用户名密码认证

服务端配置(server.properties):# 开启SASL认证 security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN# 配置JAAS文件路径 listeners=SASL_PLAINTEXT://localhost:9092 sasl.enabled.mechanisms=PLAIN listener.name.sasl_plaintext.plain.sasl.jaas.config=org.apache.kafk…

数据采集与融合技术第四次实践作业

gitee链接: https://gitee.com/zxbaixuexi/2024scrapy/tree/master/第四次实践 作业①: 1) 使用 Selenium 框架+ MySQL 数据库存储技术路线爬取“沪深 A 股”、“上证 A 股”、“深证 A 股”3 个板块的股票数据信息。 候选网站:东方财富网: http://quote.eastmoney.com/cen…

项目冲刺11.12

这个作业属于哪个课程 计科22级34班这个作业要求在哪里 作业要求这个作业的目标 进行为期七天的项目冲刺并记录前言 本篇博客是项目冲刺的第四篇,七篇博客的汇总如下:博客汇总第一篇博客第二篇博客第三篇博客第四篇博客第五篇博客第六篇博客第七篇博客团队简介队名 拖延是你不…