尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

题解:P10856 【MX-X2-T5】「Cfz Round 4」Xor-Forces
📅 发布时间:2026/6/22 10:14:56

题解

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

由题意得,一段区间颜色段个数可以转化为区间长度减去相邻同色个数,即区间 \([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;
}

相关新闻

  • 题解:AT_abc147_f [ABC147F] Sum Difference
  • 20231326《密码系统设计》第八周预习报告
  • 解放双手!使用Roslyn生成代码让你的 HTTP 客户端开发变得如此简单

最新新闻

  • 多模态大模型在体育裁判中的应用:能力、挑战与技术实现路径
  • 软件测试实战:Selenium、JMeter、Postman工具链融合与项目级流程解析
  • Codex底层认知五基石:Thread、Plan Mode、Skills、Agent与Context Window
  • AgentV-RL:用智能体验证器破解强化学习奖励设计难题
  • FCPO算法:轻量级混合群智能策略破解昂贵黑箱优化难题
  • 题解:AcWing 396 矿场搭建

日新闻

  • 2026速览惠州叛逆青少年学校前十大排名名单出炉 - 武汉中职最新信息发布
  • 2026上饶白蚁消杀哪家好?15年本土2大权威白蚁防治公司推荐(金盾虫控/青蚁卫士) - 我叫一
  • 天龙八部单机版终极数据管理工具:5个技巧快速掌握游戏数据编辑

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号