【CodeChef PREFIXOR】Prefix XOR
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的更多相关文章
- 【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 ...
- 【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是上次询问的结 ...
- 【做题】agc016d - XOR Replace——序列置换&环
原文链接 https://www.cnblogs.com/cly-none/p/9813163.html 题意:给出初始序列\(a\)和目标序列\(b\),都有\(n\)个元素.每次操作可以把\(a\ ...
- 【Codechef FRBSUM】【FJOI2016】【BZOJ4299】【BZOJ 4408】 可持久化线段树
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 475 Solved: 287[Submit][Status ...
- 【线性基】hdu3949 XOR
给你n个数,问你将它们取任意多个异或起来以后,所能得到的第K小值? 求出线性基来以后,化成简化线性基,然后把K二进制拆分,第i位是1就取上第i小的简化线性基即可.注意:倘若原本的n个数两两线性无关,也 ...
- 【CodeChef EDGEST】Edges in Spanning Trees(树链剖分+树上启发式合并)
点此看题面 大致题意: 给你两棵\(n\)个点的树,对于第一棵树中的每条边\(e_1\),求存在多少条第二棵树中的边\(e_2\),使得第一棵树删掉\(e_1\)加上\(e_2\).第二棵树删掉\(e ...
- 【洛谷】【线段树+位运算】P2574 XOR的艺术
[题目描述:] AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[ ...
- 【CodeChef】Querying on a Grid(分治,最短路)
[CodeChef]Querying on a Grid(分治,最短路) 题面 Vjudge CodeChef 题解 考虑分治处理这个问题,每次取一个\(mid\),对于\(mid\)上的三个点构建最 ...
- 【CodeChef】Palindromeness(回文树)
[CodeChef]Palindromeness(回文树) 题面 Vjudge CodeChef 中文版题面 题解 构建回文树,现在的问题就是要求出当前回文串节点的长度的一半的那个回文串所代表的节点 ...
随机推荐
- HBase第二章 基本API
1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...
- Tp框架之命名空间
命名空间,相当于虚拟目录 实现自动加载类的机制 初始命名空间:Library文件夹 初始命名空间下面有很多根命名空间: 1.Library里面的文件夹 2.APP的模块文件夹 在tp框架中,只有这两个 ...
- TensorFlow深度学习实战---图像数据处理
图像的亮度.对比度等属性对图像的影响非常大,这些因素都会影响最后的识别结构.当然,复杂的预处理过程可能会导致训练效率的下降(利用TensorFlow中多线程处理输入数据的解决方案). 同一不同的原始数 ...
- rocketmq Lock failed,MQ already started -c参数
今天部署rocketmq集群时一台机器部署一个master 和slave,slave部署总是失败,通过查看日志显示下面的错误 java.lang.RuntimeException: Lock fail ...
- WebGL射线拾取模型——八叉树优化
经过前面2篇WebGL射线拾取模型的文章,相信大家对射线和模型面片相交的原理已经有所了解,那么今天我们再深入探究关于射线拾取的一个问题,那就是遍历场景中的所有与射线相交的模型的优化问题.首先我们来复习 ...
- windows更改MySQL存储路径
在C:\ProgramData\MySQL\MySQL Server 5.7文件夹 my.ini是默认的配置文件.在这里我们只更改数据存储路径.不更改配置文件 1 # Path to the data ...
- 王者荣耀交流协会 - 第6次Scrum会议(第二周)
Scrum master :刘耀泽 工作照片: 照片由刘耀泽(本人)拍摄,组内成员刘耀泽,高远博,王磊,王玉玲,王超,任思佳,袁玥全部到齐. 时间跨度: 2017年10月25日 17:00 — 17: ...
- 03慕课网《vue.js2.5入门》——Vue-cli的安装,创建webpack模板项目
安装Vue-cli 第一种 貌似不可以,然后用了第二种,但是重装系统后,第二种不能用了,用了第一种可以 # 全局安装vue -cli命令npm install --global vue-cli # 创 ...
- request内置对象在JSP
- QHash和QMultiHash使用
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QHash和QMultiHash使用 本文地址:http://techieliang. ...