P9055 [集训队互测 2021] 数列重排

news/2025/3/24 20:00:27/文章来源:https://www.cnblogs.com/biyimouse/p/18787661

P9055 [集训队互测 2021] 数列重排

部分分其实可以给出很多的启发。

首先 \(f(0)\) 显然任何区间都能满足条件,答案应该是 \(\frac{n(n - 1)}{2}\)

然后考虑 \(f(m)\),一种构造方式是先来 \(X\)\(0、1、 ...、 m - 1\),此时所有长度 \(\geq m\) 的区间都满足条件。但我们还会有一些多出来的数,处理方式是将这些数放到序列开头,并且调整每一组使得开头的这一段数为每一组数的后缀。结构大概类似于 \(0、 2、 5、 ...、 0、 2、 5、 ...、 0、 2、 5\),可以发现此时依旧满足所有 \(\geq m\) 的区间都满足条件。

\(f(m)\) 的启发考虑 \(f(i)\),我们可以先将 \(0 \sim i- 1\) 都按照 \(f(m)\) 的方法排好,然后我们考虑如何插入剩下的数。

注意到我们的构造方式已经使得任意长度 \(\geq i\) 的区间都满足条件,所以接下来插入的数如果插到某一个块(这里把上文的一组数叫做“块”)内部一定不优,换言之我们一定要把它插到块与块交界的地带或者整个序列的左侧和右侧。

我们分别考虑插到块与块交界地带会产生的不合法区间。

首先块与块之间应该有 \(X - 1\) 个空,然后如果在某个空插一个数会增加 \(2(i - 1) + r + 1\) 个不合法区间,其中 \(r\) 这个空已经插入的数量。因为它可以和本来就不合法的块内区间(即长度 \(< i\) 的区间)组成不合法区间,还可以和空内的组合以及自己也是一个不合法的区间。

然后如果插入到两侧则会产生 \(i - 1 + r + 1\) 个不合法区间,分析同上。

我们显然要让两侧和中间尽可能平衡,所以我们先在两侧插 \(2(i - 1)\) 个数,然后平均的对于两侧和中间插即可。

接下来我们考虑实现。我们可以容斥,减去所有不合法的区间。为了方便叙述我们令 \(calc(l, r)\) 表示首项与末项分别为 \(l、r\) 的公差为 \(1\) 的等差数列求和。

以下记 \(pre\) 为小于 \(i\) 的数量,\(suf\) 为大于等于 \(i\) 的数量。

先让 \(f(i) = calc(1, n)\),然后减去所有按照 \(f(m)\) 的方法排好后的不合法区间,即长度小于 \(i\) 的区间。显然长度为 \(l\) 的区间有 \(pre - l + 1\) 个,总个数就是 \(calc(pre - (i - 1) + 1, pre)\)

然后我们要在两侧插数,注意我们插入的数个数为 \(\min(2(i - 1), suf)\)。此时记在左侧插入 \(lx\) 个数,右侧插入 \(rx\) 个数。此时增加的不合法区间(对于左侧)一定是左端点为这 \(lx\) 个数,右端点为这 \(lx\) 个数加上块内的 \(i - 1\) 个数,那么总和就是 \(calc(i, lx + i -1)\)\(calc(i, rx + i - 1)\)

接着是平均插数,具体情况之前分析过了。设完整地插了 \(z\) 轮,然后剩下 \(y\) 个多出来的数。那么增加的不合法区间个数就是 \(calc(2i - 1, 2i - 1 + z - 1) \times (j + 1) + y \times (2i - 1 + z)\)。其中 \(j + 1\) 是所有空的数量。

洛谷有点卡常,少用 long long。值得注意的是 LOJ 完全不卡。

#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = (a); i <= (b); i ++)
#define fro(i, a, b) for (int i = (a); i >= b; i --)
#define INF 0x3f3f3f3f
#define eps 1e-6
#define lowbit(x) (x & (-x))
#define initrand srand((unsigned)time(0))
#define random(x) ((LL)rand() * rand() % (x))
#define eb emplace_back
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<double, int> PDI;
inline int read() {int x = 0, f = 1;char ch = getchar();while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }while (ch >= '0' && ch <= '9') { x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar(); }return x * f;
}const int N = 10000010, Mod = 998244353;
int m, l, r;
int f[N], a[N], s[N], X, n;
char op[N]; inline LL calc(int l, int r) {return 1ll * (l + r) * (r - l + 1) / 2 % Mod;
}inline int min(int x, int y) {return x < y ? x : y;
}inline void sub(int &x, int y) {x = (x < y ? x + Mod - y : x - y); 
}int main() {m = read(), l = read(), r = read(), X = read();rep(i, 0, m - 1) {scanf(" %c", &op[i]);s[i] = a[i] = X + (op[i] == '1');n += a[i];} fro(i, m - 1, 0) s[i] += s[i + 1];f[0] = calc(1, n);int j = a[0]; rep(i, 1, m) {int suf = s[i], pre = n - s[i];f[i] = calc(1, n);sub(f[i], calc(pre - i + 2, pre));int tmp = min(2ll * (i - 1), suf);int lx = tmp / 2, rx = tmp - lx;sub(f[i], calc(i, i + lx - 1));sub(f[i], calc(i, i + rx - 1));// f[i] = ((f[i] - calc(i, i + lx - 1)) % Mod + Mod) % Mod;// f[i] = ((f[i] - calc(i, i + rx - 1)) % Mod + Mod) % Mod;int lst = suf - tmp, z = lst / (j + 1), y = lst % (j + 1);sub(f[i], 1ll * calc(2 * i - 1, 2 * i - 1 + z - 1) * (j + 1) % Mod);sub(f[i], 1ll * y * (2 * i - 1 + z) % Mod);// f[i] = ((f[i] - calc(2 * i - 1, 2 * i - 1 + z - 1) * (j + 1) % Mod) % Mod + Mod) % Mod;// f[i] = ((f[i] - y * (2 * i - 1 + z)) % Mod + Mod) % Mod;j = min(j, a[i]);}LL pw = 1, ans = 0;rep(i, 0, m) {if (l <= i && i <= r) ans = ans ^ (pw * f[i] % Mod);pw = pw * 233 % Mod; } printf("%lld\n", ans);return 0;
}

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

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

相关文章

web-CodeInject

<?php#Author: h1xaerror_reporting(0); show_source(__FILE__);eval("var_dump((Object)$_POST[1]);");eval("var_dump((Object)$_POST[1]);");:这行代码使用了eval()函数,这是一个非常危险的函数,因为它会执行传递给它的字符串作为PHP代码。这意味…

kettle插件-dm达梦数人大金仓Vastbase数据库插件

在国家大力倡导原创技术、推动信息技术应用创新(信创)的政策背景下,摆脱对国外技术的依赖、构建自主可控的信息技术体系成为重要发展方向。大数据作为信息技术的重要组成部分,国产大数据技术和产品迎来了前所未有的发展机遇。 信创旨在实现核心技术自主可控,保障国家信息安…

广义优势估计(GAE):端策略优化PPO中偏差与方差平衡的关键技术

广义优势估计(Generalized Advantage Estimation, GAE)由Schulman等人在2016年的论文中提出,是近端策略优化(PPO)算法的重要基础理论,也是促使PPO成为高效强化学习算法的核心因素之一。 GAE的理论基础建立在资格迹(eligibility traces)和时序差分λ(TD-λ)之上,为深入理解GA…

集合体系介绍、collection的使用--java进阶day09

1.集合体系结构 我们要学习的集合大体分为两种,一种是单列集合,一种是双列集合2.单列集合 单列集合又分为两个派系,分别为list接口和set接口,这两个接口皆是collection接口的子接口3.Collection接口既然要使用,那就必然要创建对象,但我们知道Collection是接口,不能实例化…

mybatis组件SqlSource的种类

SqlSource是mybatis重要的组件,是对你写的sql语句的简单封装。public interface SqlSource {BoundSql getBoundSql(Object parameterObject);}这个接口有很多种实现:VelocitySqlSource这个实现类是一个测试。实际上mybatis根本就不会使用这个实现类。 那么在mybatis内部是在哪…

静雅斋目录2

托管于国内企业顶想云的使用目录前情概要 本来已经有一个使用目录了,但是实在是受不了 GitHub 时不时卡壳的表现,就重新启用这个国内的搜索目录,外观要稍微差一点,但使用体验要好得多。 托管地址 托管于 顶想云 平台的目录样式 .编辑地址:顶想云.iframe-container { /* 容…

ARP高级欺骗-配置路由转发

引出问题: 当我们发起一次ARP欺骗之后,目标主机会出现断网情况。这种很容易就会被目标主机A发现。那我们怎么让目标主机发现不了自己被ARP欺骗了呢?问题描述: 1.受害主机A断网: 当目标主机A上网时,会进行TCP的连接,但是因为ARP欺骗之后,主机A的路由转发到的是主机B而不…

使用XIAO ESP32C6, XIAO扩展板和SHT31温湿度传感器构建温湿度计

我很高兴与您分享我的最新项目:我使用XIAO ESP32C6, XIAO扩展板和SHT31温湿度传感器构建的DIY温湿度计。我的目标是创造一种设备,可以帮助我监测家里的湿度水平,特别是因为我住在沿海热带地区,那里的湿度波动很大。这个想法来自于我需要保持一个舒适的室内环境。有时空气会…

可视化图解算法:判断一个链表是否为回文结构(回文链表)

对于链表的相关操作,我们总结了一套【可视化+图解】方法,依据此方法来解决链表相关问题,链表操作变得易于理解,写出来的代码可读性高也不容易出错。1. 题目 描述 给定一个链表,请判断该链表是否为回文结构。 回文是指该字符串正序逆序完全一致。 数据范围: 链表节点数 0≤…

使用ESP32和Gemini REST API语音输入调用带有自定义参数的函数

我们在建造什么? 在之前的教程中,我介绍了如何通过REST将ESP32连接到谷歌Gemini API以发送音频文件并对其进行转录。在本教程中,我将扩展到实际使用录制的音频而不是转录它-在这种情况下,打开和关闭LED环,加上根据语音命令改变LED的颜色。虽然我只是在操纵一个LED环,但你…

20244211 实验一《Python程序设计》实验报告

20244211 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2442 姓名: 朱睿颖 学号:20244211 实验教师:王志强老师 实验日期:2025年3月18日 必修/选修: 专业选修课 1.实验内容熟悉Python开发环境; 练习Python运行、调试技能; 编写程序,练习…