题意:

给定一个长度为 \(n=2^k\) 的数组 \(a\),下标从 \(0\) 开始,维护 \(m\) 次操作:

  1. 给定 \(x\),设数列 \(a'\) 满足 \(a'_i=a_{i\oplus x}\),将 \(a\) 修改为 \(a'\)。其中 \(\oplus\) 表示按位异或运算。
  2. 给定 \(l,r\),查询 \(a\) 的下标在 \(l,r\) 之间的子数组有多少颜色段。不保证 \(\bm {l\le r}\),若 \(\bm{l > r}\),请自行交换 \(\bm{l,r}\)。

其中,一个极长的所有数都相等的子数组称为一个颜色段。

强制在线。

\(T \in \{ 0, 1 \}\),\(0\le k\le 18\),\(n=2^k\),\(1\le m\le 2\times 10^5\),\(1\le a_i\le n\),\(\mathit{op} \in \{ 1, 2 \}\),\(0\le x,l,r < n\)。

思路

  • 乍一看操作1几乎完全无法操作。但是自己手动模拟几组数据或者打表可以发现一些有趣的事实:
  1. 操作1有结合律,因此询问事实上等价于询问一个区间根据操作1操作后的颜色段数,其中操作1的 \(x\) 是之前所有操作的前缀异或和。

  2. 以2的次幂为长度的区间(即类似于线段树各层上的区间)无论异或的数是多少,这个区间内的数一定仍在长度相等的区间里,只是顺序可能变动。

    这个结论是比较好感性理解的。对于线段树上的一段区间,其区间的序号的二进制一定是一段高位相等而剩下的低位连续。

    这些序号同时异或上一个数后高位仍然对位相同而低位仍覆盖一段相对应的区间。

  3. 对于一段区间,其异或上的值只有小于其长度的才有用。这里的“有用”指的是没办法在线 \(O(1)\) 算出来区间对应的地方,必须预处理的。

    因为仍然考虑类似于2的想法,对于区间里的所有序号,如果改变其高位,那么实际上与另一段高位改变后的区间异或上低位的值是等同的。

    因此只需要对于每个区间预处理出其 \(0\) 到 \(len-1\) 的异或后的答案,就可以 \(O(1)\) 回答询问了。

code

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+7;
int T,k,m,a[N],n;
vector <int> f[N<<2];
struct node
{
#define ls (u<<1)
#define rs ((u<<1)|1)
void build(int u,int l,int r)
{
int len=r-l+1,mid=(l+r)>>1;f[u].resize(len);
if(l==r){f[u][0]=0;return;}
build(ls,l,mid),build(rs,mid+1,r);
for(int x=0;x<len;x++)
f[u][x]=f[ls][x%(len/2)]+f[rs][x%(len/2)]+(a[mid^x]==a[(mid+1)^x]?1:0);
}
int query(int u,int l,int r,int ql,int qr,int x)
{
int mid=(l+r)>>1,len=r-l+1,ceng=__lg(r-l+1),newl=l^(x>>ceng<<ceng),newu=u+(newl-l)/len,newx=x%len,res=0;
if(ql<=l&&qr>=r) return f[newu][newx];
if(ql<=mid) res+=query(ls,l,mid,ql,qr,x);
if(qr>mid) res+=query(rs,mid+1,r,ql,qr,x);
if(ql<=mid&&qr>mid) res+=a[mid^x]==a[(mid+1)^x]?1:0;
return res;
}
}ds;
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>T>>k>>m;n=1<<k;
for(int i=0;i<n;i++) cin>>a[i];
ds.build(1,0,n-1);
int lst=0,sumx=0;
for(int i=1,op,l,r,t;i<=m;i++)
{
cin>>op;if(op==1) {cin>>t,t=t^(T*lst),sumx=sumx^t;continue;}
cin>>l>>r;l=l^(T*lst),r=r^(T*lst);if(l>r) swap(l,r);lst=r-l+1-ds.query(1,0,n-1,l,r,sumx);cout<<lst<<'\n';
}
}

P10856 【MX-X2-T5】「Cfz Round 4」Xor-Forces题解的更多相关文章

  1. LibreOJ #525. 「LibreOJ β Round #4」多项式

    二次联通门 : LibreOJ #525. 「LibreOJ β Round #4」多项式 官方题解 : /* LibreOJ #525. 「LibreOJ β Round #4」多项式 由于会有多种 ...

  2. [LOJ#525]「LibreOJ β Round #4」多项式

    [LOJ#525]「LibreOJ β Round #4」多项式 试题描述 给定一个正整数 k,你需要寻找一个系数均为 0 到 k−1 之间的非零多项式 f(x),满足对于任意整数 x 均有 f(x) ...

  3. [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)

    [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机) 试题描述 IOI 的比赛开始了.Jsp 和 Rlc 坐在一个角落,这时他们听到了一个异样的声音 …… 接着他们发现自己收 ...

  4. loj536「LibreOJ Round #6」花札(二分图博弈)

    loj536「LibreOJ Round #6」花札(二分图博弈) loj 题解时间 很明显是二分图博弈. 以某个点为起点,先手必胜的充要条件是起点一定在最大匹配中. 判断方法是看起点到该点的边有流量 ...

  5. loj #547. 「LibreOJ β Round #7」匹配字符串

    #547. 「LibreOJ β Round #7」匹配字符串   题目描述 对于一个 01 串(即由字符 0 和 1 组成的字符串)sss,我们称 sss 合法,当且仅当串 sss 的任意一个长度为 ...

  6. [LOJ#531]「LibreOJ β Round #5」游戏

    [LOJ#531]「LibreOJ β Round #5」游戏 试题描述 LCR 三分钟就解决了问题,她自信地输入了结果-- > -- 正在检查程序 -- > -- 检查通过,正在评估智商 ...

  7. [LOJ#530]「LibreOJ β Round #5」最小倍数

    [LOJ#530]「LibreOJ β Round #5」最小倍数 试题描述 第二天,LCR 终于启动了备份存储器,准备上传数据时,却没有找到熟悉的文件资源,取而代之的是而屏幕上显示的一段话: 您的文 ...

  8. [LOJ#516]「LibreOJ β Round #2」DP 一般看规律

    [LOJ#516]「LibreOJ β Round #2」DP 一般看规律 试题描述 给定一个长度为 \(n\) 的序列 \(a\),一共有 \(m\) 个操作. 每次操作的内容为:给定 \(x,y\ ...

  9. [LOJ#515]「LibreOJ β Round #2」贪心只能过样例

    [LOJ#515]「LibreOJ β Round #2」贪心只能过样例 试题描述 一共有 \(n\) 个数,第 \(i\) 个数 \(x_i\) 可以取 \([a_i , b_i]\) 中任意值. ...

  10. [LOJ#526]「LibreOJ β Round #4」子集

    [LOJ#526]「LibreOJ β Round #4」子集 试题描述 qmqmqm有一个长为 n 的数列 a1,a2,……,an,你需要选择集合{1,2,……,n}的一个子集,使得这个子集中任意两 ...

随机推荐

  1. 使用docker-compose 部署本地apollo

    注意: Mysql 需要自己安装本教程只提供apollo的安装和部署 拉取镜像 docker pull apolloconfig/apollo-portal docker pull apollocon ...

  2. 使用 kubeadm 创建高可用 Kubernetes 及外部 etcd 集群

    博客链接:使用 kubeadm 创建高可用 Kubernetes 及外部 etcd 集群 前言 Kubernetes 的官方中文文档内容全面,表达清晰,有大量示例和解析 无论任何情况下都推荐先花几个小 ...

  3. HTTP协议与RESTful API实战手册(终章):构建企业级API的九大秘籍 🔐

    title: HTTP协议与RESTful API实战手册(终章):构建企业级API的九大秘籍 date: 2025/2/28 updated: 2025/2/28 author: cmdragon ...

  4. FastAPI路由与请求处理全解:手把手打造用户管理系统 🔌

    title: FastAPI路由与请求处理全解:手把手打造用户管理系统 date: 2025/3/2 updated: 2025/3/2 author: cmdragon excerpt: 通过咖啡店 ...

  5. 考勤运行提示‘Length of values (115) does not match length of index (116) >>> ’

    源码 df['餐补'] = money_list 解决思路: 1.分别打印输出两个字段长度 本来以为是每个月的文件格式不一致导致有的文件好用有的文件不好用 经过耐心查看代码 前面的算法统计有一个本应该 ...

  6. PanWeiDB2.0异构数据库访问测试

    PanWeiDB2.0异构数据库访问测试 异构数据库访问兼容性测试一览表 No 访问路径 多维度结果 备注 1 PanWeiDB(集中式)-访问-PanWeiDB(集中式) √ 支持复杂SQL 2 P ...

  7. Chrome 134 版本新特性

    Chrome 134 版本新特性 一.Chrome 134 版本浏览器更新 1. 在桌面和 iOS 设备上使用 Google Lens 进行屏幕搜索 Chrome 版本 适用平台 发布进度 Chrom ...

  8. yolov5 train报错:TypeError: expected np.ndarray (got numpy.ndarray)

    前言 mac intel 机器上,使用 yolov5 物体检测训练时报错:TypeError: expected np.ndarray (got numpy.ndarray) 这个错误信息 TypeE ...

  9. Git工作流介绍

    前言 工作流其实不是一个初级主题,背后的本质问题其实是有效的项目流程管理和高效的开发协同约定,不仅是Git或SVN等SCM工具的使用. 集中式工作流 如果你的开发团队成员已经很熟悉Subversion ...

  10. Joker 前端框架组件的生命周期:深度解析与实践应用

    在 Joker 前端框架的开发体系中,组件的生命周期犹如一颗精准的导航星,指引着开发者构建高效.稳定且富有交互性的应用程序.它完整地涵盖了从组件实例诞生的那一刻起,直至其完成使命被销毁的全过程,每一个 ...