P4462 [CQOI2018]异或序列 莫队 异或

  

题目描述

已知一个长度为n的整数数列a_1,a_2,...,a_na1?,a2?,...,an?,给定查询参数l、r,问在a_l,a_{l+1},...,a_ral?,al+1?,...,ar?区间内,有多少子串满足异或和等于k。也就是说,对于所有的x,y (I ≤ x ≤ y ≤ r),能够满足a_x \bigoplus a_{x+1} \bigoplus ... \bigoplus a_y = kax??ax+1??...?ay?=k的x,y有多少组。

输入格式

输入文件第一行,为3个整数n,m,k。

第二行为空格分开的n个整数,即a_1,a_2,..a_na1?,a2?,..an?。

接下来m行,每行两个整数l_j,r_jlj?,rj?,表示一次查询。

输出格式

输出文件共m行,对应每个查询的计算结果。

输入输出样例

输入 #1复制

4 5 1
1 2 3 1
1 4
1 3
2 3
2 4
4 4

输出 #1复制

4
2
1
2
1

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define pb push_back
#define inf 0x3f3f3f3f
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
const int N=1e6+6;
int n,m,k;
int a[N],sum[N],bl[N];
struct node
{
    int l,r,id;
}s[N];
int anss[N],ans,block;

inline bool cmp(node a,node b)
{
    if(bl[a.l]!=bl[b.l])return a.l<b.l;
    if(bl[a.l]&1)return a.r<b.r;return a.r>b.r;
}
inline void del(int x)
{
    sum[a[x]]--;
    ans-=sum[a[x]^k];
}
inline void add(int x)
{
    ans+=sum[a[x]^k];
    sum[a[x]]++;
}
int main()
{
    cin>>n>>m>>k;
    block=sqrt(n);
    rep(i,1,n)RI(a[i]),a[i]=a[i-1]^a[i],bl[i]=(i-1)/block+1;

    rep(i,1,m)scanf("%d%d",&s[i].l,&s[i].r),s[i].id=i,s[i].l--;
    sort(s+1,s+1+m,cmp);
    int L=1,R=0;//指针
    rep(i,1,m)
    {
        int l=s[i].l,r=s[i].r;//范围
        while(L>l)L--,add(L);
        while(L<l)del(L++);
        while(R>r)del(R--);
        while(R<r)add(++R);

        anss[s[i].id]=ans;
    }
    rep(i,1,m)
    printf("%d\n",anss[i]);
    return 0;
}



原文地址:https://www.cnblogs.com/bxd123/p/11423275.html

时间: 2024-10-08 05:11:28

P4462 [CQOI2018]异或序列 莫队 异或的相关文章

P4462 [CQOI2018]异或序列 莫队

题意:给定数列 \(a\) 和 \(k\) ,询问区间 \([l,r]\) 中有多少子区间满足异或和为 \(k\). 莫队.我们可以记录前缀异或值 \(a_i\),修改时,贡献为 \(c[a_i\bigoplus k]\) . #include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #define R register in

CQOI2018异或序列 [莫队]

莫队板子 用于复习 #include <cstdio> #include <cstdlib> #include <algorithm> #include <cmath> #include <cstring> #include <map> #define Sqr(x) ((x)*(x)) using namespace std; const int N = 1e5 + 5; struct Q{ int x, y, id; }q[N];

Bzoj 3809: Gty的二逼妹子序列 莫队,分块

3809: Gty的二逼妹子序列 Time Limit: 35 Sec  Memory Limit: 28 MBSubmit: 868  Solved: 234[Submit][Status][Discuss] Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们规定妹子们的美丽度全都在[1,n]中. 给定一个长度为n(1<=n<=100000)的

【序列莫队】BZOJ2038- [2009国家集训队]小Z的袜子(hose)

[题目大意]给出1-N只袜子的颜色,多次询问L-R中选出一双同色袜子的概率. [思路] 裸莫队.基本的莫队步骤:①分组(每组大小为根号sqrt(n),共sqrt(n)组)②排序(左边界分组,右边界在组内按大小排序)③暴力转移 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using name

4540: [Hnoi2016]序列|莫队+ST表

考虑现在已经知道了[l,r]的答案新添入一个r+1如何更新答案 也就是右端点在r+1处左端点在l..r+1之间的所有的子序列的答案 可以找出l..r中最小的数的位置p,然后p以及p左侧作为左端点的答案就可以直接计算了 考虑左端点在p+1....r+1时对答案的贡献,可以与处理一个前缀和Si表示以i为右端点的所有子序列的答案之和 那么左端点在p+1....r+1时对答案的贡献就是Sr+1?Sp 其他端点移动的做法也同理 为什么我的莫队跑了17s,而网上的其他莫队只需要5s,人傻自带三倍常数QWQ

bzoj 3809 Gty的二逼妹子序列 —— 莫队+分块

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3809 据说一开始应该想到莫队+树状数组,然而我想的却是莫队+权值线段树... 如果用权值线段树,则修改和查询都是 O(logn),总复杂度 O(n√nlogn),艰难...(而且仔细一看空间有点卡?) 看了TJ,才发现权值也可以分块,则查询 O(√n) 但修改 O(1),就可以过咯~ 代码如下: #include<iostream> #include<cstdio> #inc

XOR and Favorite Number CodeForces - 617E -莫队-异或前缀和

CodeForces - 617E 给n个数, m个询问, 每次询问问你[l, r]区间内有多少对(i, j), 使得a[i]^a[i+1]^......^a[j]结果为k.(注意 i ! =  j)维护一个前缀异或值就可以了.要注意的是 区间[l, r], 我们需要将pre[l-1]......pre[r]都加进去, pre[l-1]不能少. #include<bits/stdc++.h> using namespace std; #define maxn 1234567 #define l

[CQOI2018] 异或序列

题目链接:戳我 哈哈哈我竟然秒切了省选题 莫队+异或. 考虑异或的性质,一个数同时异或两次等于没有进行操作.那么我们设a[i]为前i个数的异或和,显然对于一个区间\([l,now]\),\(a[l-1]\oplus a[now]\)就是这个区间里面所有的数的异或和.如果\(a[l-1]\oplus a[now]=k\)那么ans++,这等同于\(a[l-1]=k\oplus a[now]\). 代码如下: #include<iostream> #include<cstdio> #i

莫队算法详解和c实现

解析和实现 摘要:        莫队算法是一个对于区间.树或其他结构离线(在线)维护的算法,此算法基于一些基本算法,例如暴力维护,树状数组,分块,最小曼哈顿距离生成树,对其进行揉合从而产生的一个简单易懂且短小好写的算法.此算法在很多情况下可以很轻松的切掉一些复杂而且难写的数据结构问题. 关键词: 程序设计.算法.算法优化,暴力算法,分块算法,最小曼哈顿距离生成树. 背景: 众所周知,在OI竞赛.软件的设计中都会要求我们去处理各种各样的棘手的问题,而这些问题之中,有一大类就是维护问题:比如说对于