题意:

给定一个长度为 \(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. 多节点oceanbase 集群部署

    安装前准备 硬件要求 CPU最少2核 磁盘最少19G 文件系统EXT4 戓 XFS 关闭透明大页 echo never > /sys/kernel/mm/redhat_transparent_h ...

  2. 一个SQL就让内存耗光了

    一个SQL内存为什么就没了呢 最近遇到一个故障,研发新上线一个功能,成功把主机内存耗光,导致实例重启.复现一个SQL如何把数据库的内存耗光. 实验环境 Oracle Database 19c(故障发生 ...

  3. 开源EFCore 对比实体与实际数据库结构的工具-GZY.EFCoreCompare

    前言 GZY.EFCoreCompare 是一个用于 对比数据库结构和 EF Core 代码中的 DbContext 的库. 它基于 EF Core 的 Scaffolding 机制,生成 Datab ...

  4. [BZOJ3786] 星系探索 题解

    题目链接:\(BZOJ\) 本题通过 \(dyf\_DYF\) 的题解理解 \(ETT\),代码则借鉴 \(lcyfrog\) 的题解,图片则使用了何太狼的题解.在此笔者感谢这三位神犇. 声明变量: ...

  5. es6 形参的陷阱

    先看代码: var x = 1; function s (a,y = function (){ x = 2 }){     var x = 1;     y();     console.log(x) ...

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

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

  7. 查看Unity3D中默认的变量名与按键的映射

    博客地址:https://www.cnblogs.com/zylyehuo/ 选择 Edit/Project Settings/Input Manager 点击 Axes 即可查看对应变量名与按键的映 ...

  8. 万字长文详解SIFT特征提取

    本文对 SIFT 算法进行了详细梳理.SIFT即尺度不变特征变换(Scale-Invariant Feature Transform),是一种用于检测和描述图像局部特征的算法.该算法对图像的尺度和旋转 ...

  9. MySQL-排序相关原理分析

    全字段排序和rowId排序 建表语句如下: CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` ...

  10. 流式计算(四)-Flink Stream API 篇二

    个人原创文章,禁止任何形式转载,否则追究法律责任! 本文只发表在"公众号"和"博客园",其他均属复制粘贴!如果觉得排版不清晰,请查看公众号文章. 话说看图看核心 ...