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. unity游戏在ios11上不显示泰语解决办法

    最近在开发中遇到unity游戏在ios11上不显示泰语的问题,全部显示为方框内一个问号. 通过搜索发现这是Unity的一个bug,在2017.3中修复了 但升级unity风险很大,所以我采用了该文中提 ...

  2. hexo部署

    title: hexo 部署(一) date: 2018-09-16 18:01:26 tags: hexo部署配置 categories: 博客搭建 hexo博客搭建 折腾了好久的时间,终于使用he ...

  3. Java普通编程和Web网络编程准备工作

    一.工具下载 链接:https://pan.baidu.com/s/1geOdq3h 密码:pzl5 二.Java普通编程 解压下载的资料,并按readme.txt安装jdk和Eclipse. 三.J ...

  4. Google Chrome插件分享

    前言 浏览器是大家日常使用最多的工具之一,对于程序员来说,Google Chrome浏览器当然是大家优选的最爱之一.面对Chrome丰富的插件真的是爱不释手,如何把自己的Chrome调教成自己心仪的样 ...

  5. thinkphp5框架生成二维码

    二话不说,先上代码: 第一中: 不用再本地保存文件,直接在前台页面显示: 这是控制器里面的内容,哦,对啦,首先要下载SDK:.phpqrcode类文件下载,下载地址:https://sourcefor ...

  6. 四种方式实现波浪效果(CSS效果)

    一)第一种方法 (1)HTML结构 <body> <div class="animate wave"> <div class="w1&quo ...

  7. js操作对象属性值为字符串

    今天在项目开发中遇到一个没遇到过的问题,这个问题是需要对比两个对象a和b,a是一个只有一个属性的对象,b是一个含有多个属性对象,如果b中包含和a一模一样的属性名和值,则把这个一样的属性和值从b中删除了 ...

  8. Optimized Flow Migration for NFV Elasticity Control

    NFV弹性控制中的流迁移优化 ABSTRACT 基于动态创建和移除网络功能实例,NFV在网络功能控制上有很大的弹性.比如,网络功能和并,网络功能拆分,负载均衡等等. 那么为了实现弹性控制,就需要网络流 ...

  9. 软工实践第八次作业(课堂实战)- 项目UML设计(第五组)

    本次作业博客 团队信息 队名:起床一起肝活队 原组长: 白晨曦(101) 原组员: 李麒 (123) 陈德斌(104) 何裕捷(214) 黄培鑫(217) 王焕仁(233) 林志华(128) 乐忠豪( ...

  10. HDU 2012 FZU 1756关于素数的一些水题

    HDU 2012 素数判定 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...