首页 > 其他分享 >[CEOI2023] A Light Inconvenience 题解

[CEOI2023] A Light Inconvenience 题解

时间:2024-11-12 21:08:26浏览次数:1  
标签:表演者 2p 题解 geq 火炬 leq CEOI2023 2g Light

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"
#endif

const 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};
}

标签:表演者,2p,题解,geq,火炬,leq,CEOI2023,2g,Light
From: https://www.cnblogs.com/Scarab/p/18542654

相关文章

  • gym103102H AND = OR 题解
    非常巧妙的一个题。我们首先考虑单组询问该怎么做。首先需要注意到一个结论,即设答案为\(x\),那么对于\(\forally<x\),\(y\)都应该放在与组;同样的,对于\(\forally>x\),\(y\)都应该放在与组。进一步的,我们观察在\(\text{popcount}\)上也有同样的性质,即对于\(\forally,......
  • 好题记录 [集训队互测 2023] 优惠购物 题解
    首先发现这个过程的限制比较多,那么考虑重新描述这个过程。令\(x_i\)表示在第\(i\)个物品上使用了\(x_i\)张券,那么一组\(x_{1\simn}\)就描述了一个方案。方便起见,令\(s_i\)为前i个物品买完后剩了几张券,那么有:\(s_0=m\)\(s_i=s_{i-1}+\lfloor\frac{a_i-......
  • 【题解】洛谷P7287: 「EZEC-5」魔法
    P7287「EZEC-5」魔法感觉好题有思维,但是我没认真读题,看到样例就我以为了,他让任意一个区间满足大于\(S\)即可不是全部。我们手搓一下样例就可以发现,对于加法我们不加白不加的话肯定全部的数都加上,乘法肯定要等到加完后才开始,这些都是贪心思路。然后就是开始搭配操作了,我遇到......
  • 题解:「2017 山东一轮集训 Day7」逆序对
    LibreOJ6077前置知识:生成函数、组合数先考虑平方怎么做。\(f_{i,j}\)表示处理了前\(i\)个值,逆序对有\(j\)个。显然可以转移到\(f_{i+1,j},f_{i+1,j+1},f_{i+1,j+2},...,f_{i+1,j+i}\)。然后发现这个东西是个很简单的递推,而且长得很生成函数,于是可以很自然的写成\[1\t......
  • 题解:[SCOI2016] 美味
    前置知识:可持久化线段树(主席树)洛谷3293[SCOI2016]美味问题有一个长度为\(n\)的序列\(a_1,a_2,...,a_n\)。每次询问给你\(b\)、\(x\),你需要求出\(\max\{a_i+x\bigoplusb\}\)。\(1\lel\ler\len\le2\times10^5,0\lea_i,b,x<10^5\)首先,有\(l,r\)应该......
  • AtCoder Beginner Contest 378 题解
    AtCoderBeginnerContest378题解比赛链接A-Pairing贪心#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;voidShowball(){vector<int>a(5);for(inti=0;i<4;i++){intx;cin>>x;a[x]++;......
  • 题解:[XIX Open Cup, Grand Prix of Korea] Dev, Please Add This!
    前置知识:2-SAT题意[XIXOpenCup,GrandPrixofKorea]Dev,PleaseAddThis!在一张网格上有以下几种物品:空地(.)墙(#)星星(*)一个球(O)现在你要玩一个游戏。你可以让球朝上下左右某一个方向移动,但是一旦移动就必须走到底,也就是说直到前面是墙或者边界才能停。另外,如果你走......
  • 【题解】洛谷P7286:「EZEC-5」人赢
    P7286「EZEC-5」人赢可以想到对于每个数要找到比他大的数中下标最大的数,我们按照数的大小排序,我们维护原序列的一个指针,对于每个数如果比指针大那么就左移指针,可以思考下为什么:指针上的数比现在这个数要小那比后面的数都小,于是我们左移指针直到大于这个数,可以发现我们也在一直......
  • 图片批量处理工具 Light Image Resizer v7.0.9 注册码
    想要轻松压缩图片,提升工作效率?LightImageResizer中文便携正式版是您的理想选择。这款图片无损压缩工具让您能够快速调整图片大小,批量转换图像格式,一站式处理图片需求。该版本已内置注册码,可以使用全部功能。软件截图:使用说明:1、将压缩文件解压到固定位置,不要随意移动。......
  • 【题解】洛谷P8346:最澄澈的空与海
    【题解】洛谷P8346:最澄澈的空与海猜结论题,本身其实很简单,在纸上画个差不多就能想出来,我一开始想二分图最大匹配,但是还是太大了,不可以。当一个二分图有且仅有一种解时,必定有节点的入度为\(1\)。我们想到有多种匹配的情况,可以想到如果这是一个环的情况,一个左边的点将他右边的点......