【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 中文版题面 题解 构建回文树,现在的问题就是要求出当前回文串节点的长度的一半的那个回文串所代表的节点 ...
随机推荐
- 利用Anaconda进行python爬虫环境的配置-安装scrapy
1.下载Anaconda,下载地址:https://www.continuum.io/downloads 2.安装anaconda. 3.安装scrapy
- 详细讲解 A/B 测试关键步骤,快来检查下还有哪些疏漏的知识点
作为一种对照实验方法,A/B 测试通过比较两个 (或多个) 不同版本之间的差异来验证假设是否正确.该方法将特定测试组从实验其余部分中独立出来,从而得出可靠结果.在被测人不知情且测试场景真实的情况下,A ...
- Android 自动化测试及性能数据采集的 Python 脚本
文主要介绍一个基于 uiautomator2 封装的一个 Python 库 android-catcher ,该库的功能主要有对 Android 设备进行 UI 自动化测试 和 采集手机性能数据 ,适 ...
- 学习笔记之shell命令
linux shell命令学习笔记:~这里只是对自己一些常用但是不熟悉的的命令进行记录 -------------------------------------------------------- ...
- 二叉树的宽度<java版>
二叉树的宽度 思路:层序遍历的时候,记录每层的节点数量,最后取记录中的最多的数量. 代码实现: public int solution(TreeNode node){ LinkedList<Tr ...
- python-创建进程的三种方式
目录 1,os.fork() 方法 2,Process方法 3,Pool方法 1,os.fork() 方法 import os ret = os.fork() if ret == 0: #子进程 pr ...
- Spring学习(3):Spring架构(转载)
1. Spring架构图 核心容器:包括Core.Beans.Context.EL模块. ●Core模块:封装了框架依赖的最底层部分,包括资源访问.类型转换及一些常用工具类. ●Beans模块:提供了 ...
- openvpn部署
原文发表于cu:2016-03-29 参考文档: 安装:http://qicheng0211.blog.51cto.com/3958621/1575273 安装:http://www.ipython. ...
- 238. [LeetCode] Product of Array Except Self
Given an array nums of n integers where n > 1, return an array output such that output[i] is equ ...
- 如何计算FOB价格
FOB价格是国际贸易术语常有的一种算法,针对不同的对象,FOB价格也有不一样的算法.对于做外贸生意的朋友,需要了解FOB价格以及各项费用名称,以及如何计算FOB价格. FOB价格是国际FOB价格语常有 ...