题解:P10856 【MX-X2-T5】「Cfz Round 4」Xor-Forces

news/2025/11/9 18:36:27/文章来源:https://www.cnblogs.com/fengenrong/p/19204665

题解

首先,我们先考虑简单的情况,没有修改操作。

由题意得,一段区间颜色段个数可以转化为区间长度减去相邻同色个数,即区间 \([l,r]\) 的颜色段数为 \(r-l+1- \sum^r_{i=l+1}[a_i=a_{i-1}]\)

考虑线段树,那么一段区间所作的贡献即为左右两段区间的贡献之和,如果左子树右端和右子树左端相等,则减一,否则不做贡献。

void update(int rt){ans[rt]=ans[ls[rt]]+ans[rs[rt]]-(point[ls[rt]]r==point[rs[rt]].l);point[rt].l=point[ls[rt]].l,point[rt].r=point[rs[rt]].r;
}

接下来考虑修改操作,当异或到 \(x\) 的某一位为 \(1\) 时,我们就相当于将左右子树互换。

然后继续向下继续异或操作,由于异或具有交换律,我们只有在询问的时候考虑异或操作,修改直接 \(O(1)\) 即可。

但是,在查询时,每次都修改、打标记,就超时了!

注意到,\(x<n\),那么我们可以预处理,对于每一个答案提前求出来。

我们第 \(i\) 个答案可以通过 \(i-w\) 计算得出,其中 \(w\)\(i\) 的最高位。举个例子:

\(i\)01011 时,我们让它减去它最高位 01000 得到 00011,我们通过 00011 的线段树去更新 01011 的线段树。

我们不可能开 \(n\) 棵线段树,所以我们可以用可持久化线段树。

由于查询 \(m\) 次,每次查询一棵线段树,所以查询为 \(O(m \log n)\)。再来看预处理,我们一开始建树是 \(O(n)\) 的,接下来更新 \([1,n]\) 的答案,我们考虑每一个最高位 \(i\),那么它在 \([1,n]\) 中会出现 \(2^i\) 次,每次修改 \(\frac{n}{2^{i+1}}\) 个点,所以修改为 \(O(\sum_{i=0}^{k-1}2^i \times \frac{n}{2^{i+1}})\),即 \(O(n \log n)\)。综上,时间复杂度为 \(O(n \log n+m\log n)\)

Code

#include <bits/stdc++.h>
#define int long long
using namespace std;
int T, k, q, n, a[300005], rt[300005], cnt, op, l, r, x, lastans, w;
struct SegTree {int ls[300005 << 5], rs[300005 << 5], ans[300005 << 5];struct node {int l, r;} point[300005 << 5];  //记录每个节点左右两端的节点void update(int rt) {ans[rt] = ans[ls[rt]] + ans[rs[rt]] - (point[ls[rt]].r == point[rs[rt]].l);point[rt].l = point[ls[rt]].l, point[rt].r = point[rs[rt]].r;}void build(int &rt, int l, int r) {if (!rt)rt = ++cnt;if (l == r)return ans[rt] = 1, point[rt] = { a[l], a[r] }, void();int mid = l + r >> 1;build(ls[rt], l, mid), build(rs[rt], mid + 1, r);update(rt);}void change(int &rt1, int rt2, int l, int r, int x) {rt1 = ++cnt, ls[rt1] = ls[rt2], rs[rt1] = rs[rt2], ans[rt1] = ans[rt2], point[rt1] = point[rt2];if (r - l + 1 == (1 << x))swap(ls[rt1], rs[rt1]);else {int mid = l + r >> 1;change(ls[rt1], ls[rt2], l, mid, x), change(rs[rt1], rs[rt2], mid + 1, r, x);}update(rt1);}int query(int rt, int l, int r, int L, int R) {if (l == L && r == R)return ans[rt];int mid = l + r >> 1;if (R <= mid)return query(ls[rt], l, mid, L, R);else if (mid + 1 <= L)return query(rs[rt], mid + 1, r, L, R);elsereturn query(ls[rt], l, mid, L, mid) + query(rs[rt], mid + 1, r, mid + 1, R) -(point[ls[rt]].r == point[rs[rt]].l);}
} tree;
signed main() {scanf("%lld%lld%lld", &T, &k, &q), n = (1 << k);for (int i = 0; i < n; i++) scanf("%lld", &a[i]);tree.build(rt[0], 0, n - 1);for (int i = 1, j = k; i < n; i++, j = k) {while (!((i >> j) & 1)) j--;                              //求最高位tree.change(rt[i], rt[(i ^ (1 << j))], 0, n - 1, j + 1);  //注意j+1}while (q--) {scanf("%lld", &op);if (op == 1)scanf("%lld", &x), x = (x ^ (T * lastans)), w = (w ^ x);else {scanf("%lld%lld", &l, &r), l = (l ^ (T * lastans)), r = (r ^ (T * lastans));if (l > r)swap(l, r);printf("%lld\n", lastans = tree.query(rt[w], 0, n - 1, l, r));}}return 0;
}

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

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

相关文章

python: Virtualenv的安装与应用

一,安装Virtualenv 以ubuntu为例: 安装pip # apt install python3-pip 安装virtualenv # apt install python3-virtualenv二,创建环境 $ virtualenv -p /usr/bin/python3.12 myenv 三,进入/退出 环境 进入 $ sourc…

题解:AT_abc147_f [ABC147F] Sum Difference

题意 在一个等差数列中取出若干个元素,求取出的元素与未取出的元素的差值有多少种可能。 思路 首先,我们有一个式子: \[w(i)=\sum_{i \in S}A_i-\sum_{i \notin S}A_i \]不难看出,该式可以变为: \[w(i)=2\times \…

20231326《密码系统设计》第八周预习报告

20231326《密码系统设计》第八周预习报告 目录20231326《密码系统设计》第八周预习报告学习内容《Windows C/C++加密解密实战》第 12 章1. 什么是 SSL 协议 (Secure Sockets Layer)2. SSL/TLS 协议发展历程3. SSL v3/T…

PERL Docker 容器化部署指南

PERL(Practical Extraction and Reporting Language)是一种高级、通用、解释型、动态编程语言,其语法借鉴了C、Shell脚本、AWK和sed等多种语言特性,广泛应用于系统管理、Web开发、网络编程等领域。通过Docker容器化…

解放双手!使用Roslyn生成代码让你的 HTTP 客户端开发变得如此简单

在现代 .NET 开发中,源代码生成器(Source Generators)是一项强大的功能,它允许开发者在编译时自动生成代码,从而减少样板代码的编写,提高开发效率和代码质量。本文主要介绍使用Roslyn实现两个代码生成器:HttpCl…

pandoc用法

要将你的 `文件V5.0_2.docx` 文件转换为 Markdown 格式,使用 **Pandoc** 是一个非常直接的选择。我已经为你准备好了相应的命令,并补充了一些实用技巧。 ### 📝 核心转换命令 在终端或命令行中,导航到你的 `.docx…

JMeter:性能测试利器全解析 - 实践

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

251109

JT-JY13T1S1Hello, Tourist information center, Mike speaking, how can i help you? Hi, i want to find out about cockery classes. I believe there is some one-day calsses for tourists. Well, they are open…

electron-vite为linux打包成功,但是安装后运行无反应

属于shark插件没有运行 在代码中使用动态导入,如果导入成功就使用shark压缩,如果没有就不压缩。 `// 动态导入 sharp,如果加载失败则优雅降级 let sharp: any = null let sharpAvailable = false async function lo…

吐血推荐!6款超好用的AI论文写作工具

吐血推荐!6款超好用的AI论文写作工具 在学术写作这条漫长的道路上,高效的工具常常能够助力前行。本文会为你详细介绍6款备受赞誉的AI论文写作工具,让你在论文创作时如虎添翼。 1. 鲲鹏智写:一站式论文深度解决方案…

完整教程:金蝶云星瀚 | 生产制造成本核算终极实操手册(从0到1,含两套完整案例)

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

PHP中各种超全局变量使用

在PHP中,超全局变量是由PHP系统预先定义的一套变量,它们在脚本的所有作用域中都是可用的。这意味着开发者不需要执行特定的global语句就能访问这些变量。以下是一些常用的PHP超全局变量以及它们的使用方法和注意事项…

详细介绍:对于返回倒数第 k 个节点、链表的回文结构、链表相交题目的解析

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

实用指南:TensorFlow2 Python深度学习 - TensorFlow2框架入门 - 自动微分和梯度

实用指南:TensorFlow2 Python深度学习 - TensorFlow2框架入门 - 自动微分和梯度pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-…

浏览器Blockstack.org全名字段输入限制缺失漏洞分析

本文详细分析了Blockstack浏览器端全名字段缺乏输入长度限制导致的服务中断风险,包括漏洞发现过程、安全影响评估以及开发团队与安全研究员的讨论过程。漏洞报告 #304073 - browser.blockstack.org 全名字段字符串大小…

2025年维修厂家推荐排行榜单:行业权威解析

摘要 随着制冷行业在2025年的快速发展,维修厂家在保障设备高效运行中扮演关键角色。本文基于行业数据和用户口碑,解析2025年维修厂家排行榜单,重点推荐优质服务商,并提供详细表单供参考,帮助用户选择可靠的合作伙…

2025年维修厂家口碑排行榜:专业制冷服务首选

摘要 2025年维修厂家行业正迎来技术革新与市场需求增长,制冷设备维修服务成为关键领域。本文基于行业数据与用户反馈,推出维修厂家推荐排行榜单,旨在帮助用户选择靠谱的合作伙伴。榜单涵盖口碑、实力、服务等多维度…

行业内专业的维修厂家功能亮点

摘要 随着制冷行业的快速发展,2025年维修厂家市场呈现出技术升级和服务多元化的趋势。本文基于行业数据和用户口碑,解析维修厂家的核心功能亮点,并提供一份权威的维修厂家推荐排行榜单,供用户参考选择。表单排名综…