https://odzkskevi.qnssl.com/f0fbdb108ec813b1294f8f714805963b?v=1502083692

网上搜到的题解:

http://blog.csdn.net/zzkksunboy/article/details/76563303

xor的题,一般是考虑第一个不一样的位。

这个题当时考虑都是从字典树解决。这题可以对每个左边界找到最远的右边界,记作数组num[i]。

答案算两个部分,一个是num[i](l<=i<=r)小于等于r的,一个是num[i](l<=i<=r)大于r,第二部分答案要变成r。强制在线用主席树。

#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define dow(i,l,r) for(int i=r;i>=l;i--)
#define rep0(i,r) for(int i=0;i<r;i++)
#define repedge(i,x) for(int i=fi[x];i;i=e[i].next)
#define maxn 10001000
#define maxm 400400
#define LL long long
using namespace std; int rson[maxn],lson[maxn],total=,n,m,root[maxm],lst[][];
LL sz[maxn],sum[maxn];
int pre[maxm],num[maxm],a[maxm]; int getnew()
{
++total;
sum[total]=sz[total]=lson[total]=rson[total]=;
return total;
} void change(int &x,int old,int l,int r,LL y)
{
//printf("%d %d %d %lld %lld %lld\n",x,l,r,sum[old],sz[old],y);
x=getnew();
sum[x]=sum[old]+y;
sz[x]=sz[old]+;
lson[x]=lson[old];
rson[x]=rson[old];
if (l==r) return;
int mid=(l+r)>>;
if (y<=mid) change(lson[x],lson[old],l,mid,y);
else change(rson[x],rson[old],mid+,r,y);
} LL ask1(int x,int l,int r,int y)
{
//printf("%d %d %d %lld %d %lld\n",x,l,r,sum[x],lson[x],sum[lson[x]]);
if (!x) return ;
if (l==r) return sum[x];
int mid=(l+r)>>;
if (y<=mid) return ask1(lson[x],l,mid,y);
return sum[lson[x]]+ask1(rson[x],mid+,r,y);
} LL ask2(int x,int l,int r,int y)
{
if (!x) return ;
if (l==r) return sz[x];
int mid=(l+r)>>;
if (y<=mid) return sz[rson[x]]+ask2(lson[x],l,mid,y);
return ask2(rson[x],mid+,r,y);
} void pput(int x,int l,int r)
{
printf("%d %d %d %lld %lld\n",x,l,r,sum[x],sz[x]);
if (l==r) return;
int mid=(l+r)>>;
pput(lson[x],l,mid);
pput(rson[x],mid+,r);
} int main()
{
// freopen("1.in","r",stdin);
scanf("%d",&n);
sum[]=sz[]=lson[]=rson[]=;
pre[]=;
rep(i,,n) {
scanf("%d",&a[i]);
pre[i]=pre[i-]^a[i];
}
rep0(i,) lst[i][]=lst[i][]=n;
dow(i,,n) {
// printf("%d:\n",i);
int ch1,ch2;
if (a[i+]) {
dow(j,,) {
ch1=(pre[i]>>j)&;
ch2=(pre[i+]>>j)&;
if (ch1!=ch2) {
lst[j][ch2]=i;
break;
}
}
}
num[i]=n;
dow(j,,) {
ch1=(pre[i-]>>j)&;
num[i]=min(num[i],lst[j][ch1]);
}
// rep(j,0,4) printf("%d %d %d\n",j,lst[j][0],lst[j][1]);
// printf("\n");
}
// rep(i,1,n) printf("%d %d\n",i,num[i]);
// printf("\n");
root[]=;
rep(i,,n) {
change(root[i],root[i-],,n,(LL)num[i]);
//printf("%lld %lld\n",sum[root[i]],sz[root[i]]);
}
// rep(i,1,n) {
// printf("%d:\n",i);
// pput(root[i],1,n);
// }
LL last=,ans=;
scanf("%d",&m);
while (m--) {
LL l,r;
scanf("%lld %lld",&l,&r);
l=(l+last)%n+;
r=(r+last)%n+;
if (l>r) swap(l,r);
//printf("%lld %lld\n",l,r);
LL ans=-(r+l-)*(r-l+)/;
l--;
//printf("%lld\n",ans);
//printf("%lld\n",ask1(root[r],1,n,r));
ans+=ask1(root[r],,n,r);
//printf("%lld\n",ans);
if (r<n) ans+=ask2(root[r],,n,r+)*r;
//printf("\t%lld\n",ans);
if (l>) ans-=ask1(root[l],,n,r);
//printf("%lld\n",ans);
if (r<n && l>) ans-=ask2(root[l],,n,r+)*r;
printf("%lld\n",last=ans);
//printf("/----------------------/\n");
}
return ;
}

【CodeChef PREFIXOR】Prefix XOR的更多相关文章

  1. 【BZOJ 4269】再见Xor

    zky学长提供的线性基求法: for(int i=1;i<=n;i++) for(int j=64;j>=1;j--) { if(a[i]>>(j-1)&1) { if ...

  2. 【HDU - 5790 】Prefix(主席树+Trie树)

    BUPT2017 wintertraining(15) #7C 题意 求[min((Z+L)%N,(Z+R)%N)+1,max((Z+L)%N,(Z+R)%N)+1]中不同前缀的个数,Z是上次询问的结 ...

  3. 【做题】agc016d - XOR Replace——序列置换&环

    原文链接 https://www.cnblogs.com/cly-none/p/9813163.html 题意:给出初始序列\(a\)和目标序列\(b\),都有\(n\)个元素.每次操作可以把\(a\ ...

  4. 【Codechef FRBSUM】【FJOI2016】【BZOJ4299】【BZOJ 4408】 可持久化线段树

    4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 475  Solved: 287[Submit][Status ...

  5. 【线性基】hdu3949 XOR

    给你n个数,问你将它们取任意多个异或起来以后,所能得到的第K小值? 求出线性基来以后,化成简化线性基,然后把K二进制拆分,第i位是1就取上第i小的简化线性基即可.注意:倘若原本的n个数两两线性无关,也 ...

  6. 【CodeChef EDGEST】Edges in Spanning Trees(树链剖分+树上启发式合并)

    点此看题面 大致题意: 给你两棵\(n\)个点的树,对于第一棵树中的每条边\(e_1\),求存在多少条第二棵树中的边\(e_2\),使得第一棵树删掉\(e_1\)加上\(e_2\).第二棵树删掉\(e ...

  7. 【洛谷】【线段树+位运算】P2574 XOR的艺术

    [题目描述:] AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[ ...

  8. 【CodeChef】Querying on a Grid(分治,最短路)

    [CodeChef]Querying on a Grid(分治,最短路) 题面 Vjudge CodeChef 题解 考虑分治处理这个问题,每次取一个\(mid\),对于\(mid\)上的三个点构建最 ...

  9. 【CodeChef】Palindromeness(回文树)

    [CodeChef]Palindromeness(回文树) 题面 Vjudge CodeChef 中文版题面 题解 构建回文树,现在的问题就是要求出当前回文串节点的长度的一半的那个回文串所代表的节点 ...

随机推荐

  1. PHP 0817PHP 0817 (PHP, Exploit) writeup

    作为一只ctf小白,这个题看到之后真是丝毫没有思路.虽然能基本理解php,但还是没能顺利答出,最后直接进行了搜索. 虽然做技术,“固执”是优点.但是出于对自身自身情况的了解,我觉得现阶段看题解还是很有 ...

  2. 学习笔记之shell命令

    linux shell命令学习笔记:~这里只是对自己一些常用但是不熟悉的的命令进行记录 -------------------------------------------------------- ...

  3. jsp 修改页面感受

    什么事情只有做过才知道. 最近在负责官网的开发,有一些页面需要和前端商量着修改,但是看到jsp那繁杂的标签和各种css,js混到一起,实在觉得jsp已经是一种落后的技术了,在修改过程中频频出现各种格式 ...

  4. TW实习日记:第七天

    今天早上,将项目的两个企业微信接口:登录和应用消息发送接口,做了最后的收尾工作,把目前我能解决的问题算是基本都解决了.早上还开了一个会,大意是组长封装了许多组件叫我们使用,在不断的使用中打磨组件的可用 ...

  5. 爬虫2.4-scrapy框架-图片分类下载

    目录 scrapy框架-图片下载 1 传统下载方法: 2 scrapy框架的下载方法 3 分类下载完整代码 scrapy框架-图片下载 python小知识: map函数:将一个可迭代对象的每个值,依次 ...

  6. CSP201512-2:消除类游戏

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...

  7. Linux内核学习笔记(1)-- 进程管理概述

    一.进程与线程 进程是处于执行期的程序,但是并不仅仅局限于一段可执行程序代码.通常,进程还要包含其他资源,像打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个 ...

  8. DruidDataSource源码分析

    最近公司要求基于阿里的DruidDataSource来做一个连接池监控 , 正好之前没有看过DruidDataSource的源码 , 便自己看了四个多小时写了一些自己的理解 , 给大家分享一下 , 如 ...

  9. 第1章 Python基础

    一.安装Python windows: 1.下载安装包     https://www.python.org/downloads/ 2.安装     默认安装路径:C:\python27 3.配置环境 ...

  10. python socket详解

    Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...