【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 中文版题面 题解 构建回文树,现在的问题就是要求出当前回文串节点的长度的一半的那个回文串所代表的节点 ...
随机推荐
- 强化学习读书笔记 - 13 - 策略梯度方法(Policy Gradient Methods)
强化学习读书笔记 - 13 - 策略梯度方法(Policy Gradient Methods) 学习笔记: Reinforcement Learning: An Introduction, Richa ...
- Python小白学习之基础知识(个人笔记)
介绍while else的使用,这个不常用 格式化输出 while esle ,当循环内有break语句时,不执行else语句,当没有break语句时,执行完while循环,然后执行else下面的语句 ...
- 如何解决Django与Vue语法的冲突
当我们在django web框架中,使用vue的时候,会遇到语法冲突.因为vue使用{{}},而django也使用{{}},因此会冲突. 解决办法1:在django1.5以后,加入了标签:{% ver ...
- katalon系列八:Katalon Studio图片识别
Katalon Studio自带集成了图片识别功能,有2个比较有用的图片识别相关的命令:Wait For Image Present和Click Image.这里重点讲下Click Image命令: ...
- 从零开始的Python学习Episode 9——集合
集合 集合是一个无序的,不重复的数据组合,是python基本的数据类型,把不同的元素组成一起就形成集合. 一.创建集合 s = set('smile')list = ['1','2','3']prin ...
- mtv网站架构模式适合企业网站应用吗?
mtv网站架构模式适合企业网站应用吗?有时候在思考这样一个问题. 从开发角度来说,本来mvc的进度慢了些,如果在数据库管理方面用sql的话,管理起来也不很方便.小企业网本来数据就不很多,也没什么太多安 ...
- 网络安全攻防----html基础
一.学习html的硬件条件 网页(.Html)是静态的,学习html语言需要选择Chrome浏览器和Sublime3编辑器,选择Chrome浏览器是因为Chrome浏览器兼容性比较好,支持各种各样的插 ...
- python3【基础】-list&tuple
一.list概述 list (列表)是python中最常用的数据类型之一,通过列表可以对数据实现最方便的存储,修改等操作.在python3中,list支持如下方法: Help on class lis ...
- python---json.dumps 与 json.loads /json.dump 和json.load区别
json.dumps 是将python的数据类型进行json的编码,生成json格式的数据,举例json_data = json.dumps(str) str为python的字符串类型数据,生成的j ...
- GCD最大公约数
说明: 最初跟鹏哥学习最大公约数的算法是辗转相除,确实印象很深刻,那种辗转赋值的思想在好多题目中都有运用,但随着进一步学习,我也参考了其他几种方便快捷的最大公约数求法,在这里做一个总结. . int ...