题意:

给定一个长度为 \(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. LVGL 8.3.0常用函数快速使用

    LVGL 8.3.0使用快速上手教程(使用篇) 定义页面通用样式style // 创建页面样式 static lv_style_t style; lv_style_init(&style); ...

  2. android短信数据库监听回调多次问题

    在监听android短信数据库变化时.由于只能注册content://sms/ 的observer.所以,在数据库每次状态变化的时候,都会多次回调 onChange 方式.目前还未找到很好的方式,解决 ...

  3. SpringSecurity - [01] 概述

    Spring Security 是一个灵活且强大的工具,可以帮助你构建安全可靠的Spring应用程序.它不仅简化了认证和授权的过程,而且还提供了丰富的特性和扩展点,使得开发者可以根据项目的独特需求定制 ...

  4. 我的公众号接入了DeepSeek-R1模型,成为了一个会深度思考的强大.NET AI智能体!

    前言 前不久腾讯元器宣布接入满血版 Deepseek R1 模型,模型免费使用且不限量,为智能体开发提供更多样化的模型选择,带来更丰富的智能体功能和玩法. 今天咱们一起来把我公众号的.NET AI智能 ...

  5. C# 泛型类型约束 where

    1 class Program { 2 static void Main(string[] args) { 3 4 } 5 } 6 7 interface IMyInterface { 8 void ...

  6. C# 之委托的多播

    1 delegate void NumberCalculator(int a); 2 class Program 3 { 4 static int num1 = 100; 5 static void ...

  7. CCRC软件开发评审-材料应该怎么准备

    1. 什么是CCRC软件开发评审 软件安全开发资质认证是对软件开发方的基本资格.管理能力.技术能力和软件安全过程能力等方面进行评价全软件开发服务资质级别是衡量服务提供方的软件安全开发服务资格和能力的尺 ...

  8. Android 实现人脸识别 活体检测以及人脸搜索

    关于「保护伞FaceAI SDK」 Umbrella FaceAI SDK is on_device Offline Android Face Detection .Recognition .Live ...

  9. 【Bug记录】[@vue/compiler-sfc] `defineProps` is a compiler macro and no longer needs to be imported.

    [Bug记录][@vue/compiler-sfc] defineProps is a compiler macro and no longer needs to be imported. Vue3项 ...

  10. Cython二进制逆向系列(三)运算符

    Cython二进制逆向系列(三)运算符 在开始前,先给出本文用到的py源代码 def test1(x, y): # 数学运算符 a = x + y b = x - y c = x * y d = x ...