题面

CF617E XOR and Favorite Number

给定 \(n,m,k\) 和 \(n\) 个数的序列 \(a_i\),\(m\) 次求区间 \([l,r]\) 中异或值为 \(k\) 的子序列个数。

数据范围:\(1\le n,m\le 10^5\),\(0\le k,a_i\le 10^6\)。


蒟蒻语

这题的莫队做法太一眼,谁都会是吧(

那么蒟蒻就来写一个过不了这题(会 MLE、TLE)但是可以在线且很有趣的做法:分块。

说不定谁去开大限制卡个离线蒟蒻解就成正解了


蒟蒻解

设 \(f(l,r)\) 表示区间 \([l,r]\) 的异或值为 \(k\) 的子区间数。

设 \(cross(l,r)\) 表示区间左端点在 \([1,l]\) 右端点在 \([r,n]\) 的异或值为 \(k\) 的区间数。

先容斥一下(\(cross(l-1,r+1)\) 为了抵消掉 \(f(1,n)\) 中多余的部分):

\[ans=f(l,r)=f(1,r)+f(l,n)-f(1,n)+cross(l-1,r+1)
\]

这东西前 \(3\) 项可以时空 \(\Theta(n)\) 求出,只是最后一项太恶心了,蒟蒻的方法是分块时空 \(\Theta(n\sqrt{n})\)(巨佬如果有更优做法一定要指教蒟蒻)。

设有 \(b_n\) 个块,每个块为 \([l_i,r_i]\)。

先预处理 \(i<j:cro_{i,j}=cross(r_i,l_j)\),做法同莫队,前缀和加 unordered_map。

再记 \(lc_{i,c}\) 表示 \([1,r_i]\) 中前缀和为 \(c\) 的个数,\(rc_{i,c}\) 表示 \([l_i,n]\) 中前缀和为 \(c\) 的个数。

求 \(cross(l,r)\) 时,设 \(lb=\max_{i=1}^{b_n} r_i\le l\),\(rb=\min_{i=1}^{b_n} l_i\ge r\)。

结果就是 \(cro_{lb,rb}\) 再加上

左端点在 \([r_{lb}+1,l]\) 右端点在 \([l_{rb},n]\) 的答案(用 \(rc\) 数组求)

和左端点在 \([1,r_{lb}]\) 右端点在 \([r,l_{rb}-1]\) 的答案(用 \(lc\) 数组求)

和左端点在 \([r_{lb}+1,l]\) 右端点在 \([r,l_{rb}-1]\) 的答案(用前缀和加 unordered_map)。

然后这题就做完了,别忘了这个做法过不了。


代码

#include <bits/stdc++.h>
using namespace std; //Start
typedef long long ll;
typedef double db;
#define mp(a,b) make_pair(a,b)
#define x first
#define y second
#define be(a) a.begin()
#define en(a) a.end()
#define sz(a) int((a).size())
#define pb(a) push_back(a)
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f; //Data
const int N=1e5;
int n,m,k,sm[N+2];
int a[N+1]; ll la[N+2],ra[N+2];
unordered_map<int,int> cnt; //Block
const int B=320;
int sz,b[N+1];
ll cro[B+2][B+2];
unordered_map<int,int> lc[B+2],rc[B+2];
void build(){
sz=sqrt(n);
for(int i=1;i<=n;i++) b[i]=(i-1)/sz+1;
for(int i=1;i<=b[n];i++)
for(int j=1;j<=min(sz*i,n);j++) lc[i][sm[j-1]]++;
for(int i=1;i<=b[n];i++)
for(int j=n;j>=sz*(i-1)+1;j--) rc[i][sm[j]]++;
for(int i=1;i<=b[n];i++){
for(int t=b[n];t>i;t--){
for(int j=sz*(t-1)+1;j<=min(sz*t,n);j++)
cro[i][t]+=lc[i][sm[j]^k];
cro[i][t]+=cro[i][t+1];
}
}
}
ll cross(int l,int r){
if(l<0||r>n) return 0;
int lb=b[l+1]-1,rb=b[r-1]+1;
ll res=cro[lb][rb];
cnt.clear();
for(int i=lb*sz+1;i<=l;i++) cnt[sm[i-1]]++;
for(int i=r;i<=min((rb-1)*sz,n);i++) res+=cnt[sm[i]^k];
for(int i=lb*sz+1;i<=l;i++) res+=rc[rb][sm[i-1]^k];
for(int i=r;i<=min((rb-1)*sz,n);i++) res+=lc[lb][sm[i]^k];
return res;
} //Main
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m>>k;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) sm[i]=sm[i-1]^a[i];
cnt.clear(),cnt[sm[0]]++;
for(int i=1;i<=n;i++) la[i]=la[i-1]+cnt[sm[i]^k],cnt[sm[i]]++;
cnt.clear(),cnt[sm[n]]++;
for(int i=n;i>=1;i--) ra[i]=ra[i+1]+cnt[sm[i-1]^k],cnt[sm[i-1]]++;
assert(la[n]==ra[1]);
// for(int i=1;i<=n;i++) cout<<la[i]<<' ';cout<<'\n';
// for(int i=1;i<=n;i++) cout<<ra[i]<<' ';cout<<'\n';
build();
for(int i=0;i<m;i++){
int l,r; cin>>l>>r;
cout<<ra[l]+la[r]-la[n]+cross(l-1,r+1)<<'\n';
}
return 0;
}

祝大家学习愉快!

题解-CF617E XOR and Favorite Number的更多相关文章

  1. CF617E XOR and Favorite Number

    CF617E XOR and Favorite Number 已知一个序列 \(a_1,\ a_2,\ \cdots,\ a_n\) 和 \(k\) ,\(m\) 次询问给出 \(l,\ r\) ,求 ...

  2. [CF617E]XOR and Favorite Number/[CQOI2018]异或序列

    题目大意: 给定一个长度为$n(n\leq10^5)$的数列$A$和数$k$$(A_i,k\leq10^6)$.$m$组询问,每次询问区间$[l,r]$中有多少对$i,j(l\leq i\leq j\ ...

  3. Codeforces Round #340 (Div. 2) E. XOR and Favorite Number 莫队算法

    E. XOR and Favorite Number 题目连接: http://www.codeforces.com/contest/617/problem/E Descriptionww.co Bo ...

  4. Codeforces Round #340 (Div. 2) E. XOR and Favorite Number —— 莫队算法

    题目链接:http://codeforces.com/problemset/problem/617/E E. XOR and Favorite Number time limit per test 4 ...

  5. Codeforces617 E . XOR and Favorite Number(莫队算法)

    XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes input: s ...

  6. Codeforeces 617E XOR and Favorite Number(莫队+小技巧)

    E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  7. XOR and Favorite Number(莫队算法+分块)

    E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  8. XOR and Favorite Number (莫对算法)

    E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  9. Codeforces Round #340 (Div. 2) E. XOR and Favorite Number 【莫队算法 + 异或和前缀和的巧妙】

    任意门:http://codeforces.com/problemset/problem/617/E E. XOR and Favorite Number time limit per test 4 ...

随机推荐

  1. 设计模式之工厂模式(Factory模式)

    在面向对象系统设计中经常遇到以下两类问题: 1)为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口.这样我们可以通过声明一个指向基类的 ...

  2. 自定义圆角背景的textview,抛弃shape

    自定义一个圆角背景的TextView,解放双手,不用再写shape了. 1.values目录新建attrs.xml. <?xml version="1.0" encoding ...

  3. ceph bluestore的db分区应该预留多大的空间

    前言 关于bluestore的db应该预留多少空间,网上有很多资料 如果采用默认的 write_buffer_size=268435456 大小的话 那么几个rocksdb的数据等级是 L0: in ...

  4. 关于多线程--网络编程 -- 注解反射的一点笔记(JAVA篇)

    一 . 线程 java开启一个线程的方法(三种) 方法一:继承Thread类并New一个线程对象 步骤: 1):定义一个类A继承于Java.lang.Thread类. class TestThread ...

  5. asp.net core 使用 TestServer 来做集成测试

    asp.net core 使用 TestServer 来做集成测试 Intro 之前我的项目里的集成测试是随机一个端口,每次都真实的启动一个 WebServer,之前也有看到过微软文档上 TestSe ...

  6. python-基础入门-5(模块、类和对象)

    模块 模块用import来调用,例如 from sys import argv 调用sys中argv模块 在模块里有多个def的函数 import调用全部或其中一个 类和对象 下面定义了一个类 1 c ...

  7. 用MathType怎么把分数打出来

    分数是生活中最常见的数,作为大学生学习高数概率论更是离不开分数.分数是指整体的一部分,或更一般地,任何数量相等的部分.分数是一个整数a和一个正整数b的不等于整数的比. 当在日常用语中说话时,分数描述了 ...

  8. iMindMap组织结构视图在工作上的应用体现在哪些方面

    iMindMap的组织结构图视图,可以将信息.想法和流程整合起来.本文,我们将讲述iMindMap组织结构图视图的3个实例应用. iMindMap组织结构视图 简化您的工作流程 通过在工作中构建组织结 ...

  9. 如何使用MathType输入贝塔符号?

    在文档中使用公式,常常需要输入各种符号.比如要输入三角函数公式,那么就要输入三角函数中的阿尔法α.贝塔β等符号,那么要怎么打出这类符号呢? MathType作为强大的数学公式编辑器,可以用来编辑各种数 ...

  10. 记 · ElemetnUI + Vue v-if 视图切换踩过的那些坑

    使用EleUI 做一个用户登录窗口,需要用v-if 动态切换三个表单:手机登录.账密登录和密码找回.其中需要实现一个重置表单的功能,但其间出了一些小bug.密码找回表单中有三个表单项,手机登录和账密登 ...