P13754 【MX-X17-T3】Distraction

news/2025/9/24 20:10:06/文章来源:https://www.cnblogs.com/blind5883/p/19109882

原题链接:P13754 【MX-X17-T3】Distraction - 洛谷

非常好的题,非常好的思想。简单思想的结合体就是不易察觉的难题。这题实际上就两个难点:1. 处理每个点的权值 \(v_i\)。2. 推导交换权值并找出最长字段和

首先对于每个点的权值,一种直接的求法(以求左边的大于 此点 \(u\) 的数量为例)是维护一个新的序列 \(b\),然后从原序列 \(a\) 的左边开始不断将,每个点数值 \(u\) 在 上对应的地方加一。然后每次统计 \(b\) 序列上 \([1 ,u - 1]\) 里面 \(1\) 的数量,这个数量就是 \(b\) 左边大于他的数的数量。因为设计单点修改和区间查询,所以可以使用树状数组解决。这种方法较为直观,但是时间上不算最有,且写起来比较麻烦,于是探索新的办法。

观察题目,\(a\) 序列实际上是一个 \(1 \sim n\) 的排序,如果 \(a\) 序列是按照 \(1,2,3,\dots,n\) 的方式排列,那么 \(v_i\) 都等于 \(0\)。如果保持一个点 u 位置不变,而随意改变除了 u 之外的数字,你会发现,无论如何改变,\(v_i\) 均为 \(0\),因为当一个数 k 从左边变到右边时,右边的一个数也变到了左边,两边的逆序对数量的奇偶性不会发生变化,因此 \(v_i\) 也就不会发生变化。如果要想改变 \(v_i\) 那就只能改变 u 的位置,如果把 u 向左移动一位,那么和他交换的那个数,如果大于它,那么 \(v_i\)会因为逆序对减少一个而改变;如果那个数小于它,那么 \(v_i\) 会因为逆序对增加一个而改变。
此时在对其他数进行交换,无论如何 \(v_i\) 也不会改变,因为大、小的逆序对都同增同减的。可知,对于 \(v_i\) 来说,\(v_i = \lvert i从小到大的原位置 - i的当前位置 \rvert \bmod 2\)。依靠这一点,我们就可以在 \(\operatorname O(n)\) 的时间复杂度之内简单地(就是 \(i - i 当前的位置\))算出来 \(v_i\)

然后是关于交换,通过分析可以发现,在交换的区间内,除了被交换点,区间内的其他点(下面称为被影响点)都移动了一位,因此这些点的 \(v_i\) 会变化(变化指从 \(1\) 变成 \(0\) 或者从 \(0\) 变成 \(1\))。而交换的那个点的数值变与不变,只取决于这个区间大小(在去掉当前点的情况下)的奇偶性(即位移的距离大小),如果为奇数则变化,如果为偶数则不变。

关于被影响点,设区间内被影响的点有 \(k\) 个,其中 \(v_i\) 为 1 的有 x 个,那么在交换后,这些点的贡献会从 \(x\) 变为 \(k - x\),即变化了 \(k - 2x\),如果划分给每个点,那么每个点在交换后对整体的影响就是 \(1 - 2v_i\),那么对于这批贡献只需要求最大字段和即可,这部分可使用 DP 解决。

记下来就剩下了交换点的变化,因为交换点的变化与否取决于 k 的奇偶性,因此我们在做上面的 DP 时需要分两个做,一个是区间大小为奇数的,一个区间大小为偶数的,以方便我们处理交换点。

看得出,这确实一道好题啊,不亏我费这么长时间。

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;const int N = 5000010;int n, m;
int g[N], w[N];
int f[N], h[N]; // 分别是区间长度为奇数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 * 10 + ch - '0', ch = getchar();return x * f;
}int main() 
{int T;cin >> T;while (T -- ){int sum = 0;cin >> n;for (int i = 1; i <= n; i ++ ) {scanf("%d", &g[i]);w[i] = i - g[i] & 1;sum += w[i];}memset(f, -0x3f, sizeof f);memset(g, -0x3f, sizeof g);f[1] = 1 - 2 * w[1];f[2] = 1 - 2 * w[2];h[2] = 2 - 2 * (w[1] + w[2]);int ans = 0, res = 0, maxv1 = 0, maxv2 = 0; // 长度为奇数,长度为偶数maxv1 = max({maxv1, f[1], f[2]});maxv2 = max(maxv2, h[2]);for (int i = 3; i <= n; i ++ ){f[i] = max(f[i - 2] + 2 - 2 * (w[i] + w[i - 1]), 1 - 2 * w[i]);h[i] = max(h[i - 2] + 2 - 2 * (w[i] + w[i - 1]), 2 - 2 * (w[i] + w[i - 1]));maxv1 = max(maxv1, f[i]);maxv2 = max(maxv2, h[i]);}if (maxv2 == 0) cout << sum + max({maxv1 - 1, maxv2 - 1, 0}) << endl;  else cout << sum + max({maxv1 - 1, maxv2, 0}) << endl;}return 0;
}

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

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

相关文章

台州自助建站系统热门国际新闻

从Manus到OpenManus&#xff1a;AI智能体技术如何重塑未来生活场景&#xff1f; 一、现状&#xff1a;AI智能体技术面临的三大核心矛盾 &#xff08;通过分析用户高频痛点与市场反馈提炼&#xff09; 能力与门槛的失衡 Manus展示的复杂任务处理能力&#xff08;如股票分析、代…

2025.9.24

今天上早八离散数学,认真听课发现真听懂了,然后是马克思主义基本原理,老师话很亲切,中午吃饭没休息,又出发修改表格格式了,弄了3个小时,外卖被偷了,我又点了一份,然后洗澡,没带洗发水用香皂洗头,效果不好,…

初学汇编

寄存器 存储数据速度:cpu > 内存 > 硬盘通用寄存器 寄存器是在cpu中的8位 16位 32位EAX AX ALEBX BX BLECX CX CLEDX DX DLESP SP AHEBP BP CHESI SI DHEDI DI BH内存地址的五种形式 1.立即数:如0x13FFC4 2.[r…

架构图设计还得是华为 - 智慧园区

在数字化时代,架构图就像建筑工程的设计蓝图,是技术系统从抽象想法落地为实际产品的关键桥梁。无论是手机芯片的内部逻辑布局,还是全球通信网络的节点连接,清晰、科学的架构图都能让复杂的技术体系变得“可视化”,…

解决zsh: corrupt history file /home/sgud4h5gh/.zsh_history的办法

问题 在一次重装Ubuntu随后进行了一些修改的情况下,输入命令会出现报错zsh: corrupt history file /home/sgud4h5gh/.zsh_history 并且好像不能执行,实际上是因为文件.zsh_history出现损坏或者乱码的情况。 首先要知…

StarRocks GitHub 工作流程

StarRocks项目遵循GitHub工作流规范,其中包含若干实用建议(例如保持本地环境与上游仓库同步并及时提交)。本文档详细说明在GitHub平台完成StarRocks开发的完整工作流程。 第一步:云端分叉项目访问:https://github…

【Selenium】消除Selenium报错:ChromeDriver与Chrome浏览器版本不匹配

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

伍佰亿搜索引擎网站系统企业科技网站建设

如何在apache Arrow定位与解决问题 最近在执行sql时做了一些batch变更&#xff0c;出现了一个 crash问题&#xff0c;底层使用了apache arrow来实现。本节将会从0开始讲解如何调试STL源码crash问题&#xff0c;在这篇文章中以实际工作中resize导致crash为例&#xff0c;引出如何…

2013网站建设方案沃尔玛商城

本人使用谷歌搜索了简中互联网&#xff0c;完全没有找到任何有关 ANAME 的文章……本文该不会是头一份吧 相信大家对于 DNS 的解析方式都不陌生&#xff0c;常见的有 A、CNAME、MX、TXT 记录等等。其中&#xff0c;网站常用的是 A 记录和 CNAME 记录&#xff1a;A 记录用于将域…

对象初始化器的使用方法

1. 什么是对象初始化器? 对象初始化器就是一种在创建对象的同时,直接给属性赋值的写法。不用先 new 一个对象,再一行一行地赋值。 它的作用是用来给对象初始化的 一定存在:必然要执行构造方法 2. 构造方法与对象初…

C++、Java 和 Python 在输入输出差别

C++、Java 和 Python 在输入输出(I/O)格式上有显著差异,主要体现在语法风格、处理方式和灵活性上。以下从标准输入输出、文件操作两个维度对比三者的差异,并结合示例说明核心特点。 一、标准输入输出(控制台 I/O)…

我的学习记录之自我介绍、思维导图和监督措施

一、关于我: 目前就读于中南林业科技大学涉外学院数据科学与大数据技术专业大三,介绍一下自己,在我之前的学习生活中我一般是班级里小透明的存在,成绩一直处于中等偏上,但是又不调皮捣蛋,所以老师一般不会有特别…

用 Java 和 Tesseract 进行验证码识别:基础实现与优化

验证码(CAPTCHA)是防止自动化攻击的常见手段。然而,在某些场景下,如自动化测试或者爬虫平台,可能需要识别和处理验证码图像。本文将指导你如何使用 Java 和 Tesseract OCR(光学字符识别)库来实现验证码识别,并…

新网站应该怎么做料神wordpress建站教程

A12435 思路&#xff1a;只有4中情况:A1,A2翻转&#xff0c;其他正常&#xff0c;A2A3翻转其他正常.....为了下标与数字对应我开了6个空间&#xff0c;然后从1开始循环&#xff0c;到4截止&#xff0c;因为循环中有i1害怕数组越界&#xff0c;如果索引出的数与下标不相等了&…

教育类网站开发文档上海工程项目查询

仓库建设 luogu 2120 题目大意 有一个斜坡&#xff0c;上面有n个工厂&#xff08;山顶是1&#xff0c;山脚是nnn&#xff0c;工厂都是漏填&#xff09;&#xff0c;上面有pip_ipi​个货物&#xff0c;和工厂1的距离为x1x_1x1​ 现在有一场大雨&#xff0c;你可以在某些工厂处…

网站开发项目工期流程手机版网页

BERT&#xff1a;深度学习领域中的语言理解利器 摘要 BERT&#xff08;双向编码器表示法自转换器&#xff09;是一种领先的深度学习模型&#xff0c;它在许多语言理解任务中都显示出卓越的性能。BERT模型基于转换器编码器架构&#xff0c;并通过自监督学习在大量未标记文本数…

Java第二次实验

1. 本章学习总结 本章学习了Java多方面知识:控制台输入推荐用Scanner.nextLine()避免问题,还涉及 IDE 操作与 String.split;身份证排序用Arrays.sort和String.subString,结构化编程且注意输入方法;需了解 StringB…

详细介绍:【2025PolarCTF秋季个人赛】WEB方向wp

详细介绍:【2025PolarCTF秋季个人赛】WEB方向wppre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

英语_阅读

当然可以,以下是英文与中文交替的逐句翻译:Six-year-old Brooke Neitzel wanted a dollhouse. 六岁的布鲁克奈策尔想要一个娃娃屋。 So she ordered one just by telling the familys smart speaker what she wanted…

Nuget安装以及西门子PLC通信

安装S7NetPlus库 ​添加命名空间 ,using S7.Net​创建一个西门子PLC通信对象——成员变量实例化 ,this:表示的是当前对象建立简介 ,对象名.方法名 , this.siemens.Open()​读取变量 , 装箱的一个过程 ,解析变量 ,…