题目

老瞎眼有一个长度为 n 的数组 a,为了为难小鲜肉,他准备了 Q 次询问,每次给出 一个区间[L,R],他让小鲜肉寻 找一对 l,r 使L<=l<=r<=R 且 a[l]^a[l+1]^a[l+2]...^a[r]=0,老瞎眼只让他回答r-l+1 最小是多少,若没有符合条件的 l,r 输出”-1”。

1<=n,Q<=500000,0<=a[i]<=1000000,1<=L<=R<=n

思路来源

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=41387922

题解

考虑已经处理好若干条线段了,

如何统计完整包含在线段内的最短的线段的长度,

其实和徐州网络赛的区间统计点对(l,r)对的答案算在r的单点上很像,

把线段区间[l,r]的贡献也只算在r的单点上,对单点保留区间长度的较小值

那么就相当于询问q条线段,n个端点,每条线段上覆盖的点最小的值

排序离线,一边插入点,一边询问线段,取最小值回答即可

注意一些pre[]和las[]初始化,思路来源的代码可以说非常巧妙了

代码

#include<bits/stdc++.h>
using namespace std;
const int M=(1<<20)+5,N=5e5+10;
int n,q,now,pre[M],las[M];
int a[N],rk[N],tr[N],res[N];
int cmp(int a,int b)
{return pre[a]>pre[b];
}
struct node
{int l,r,id;
}e[N];
bool operator<(node a,node b)
{return a.l>b.l;
}
void upd(int x,int v)
{for(int i=x;i<=n;i+=i&-i)tr[i]=min(tr[i],v);
}
int ask(int x)
{int ans=n+1;for(int i=x;i>0;i-=i&-i)ans=min(ans,tr[i]);return ans;
}
int main()
{scanf("%d%d",&n,&q);memset(las,-1,sizeof las);las[0]=0;memset(tr,0x3f,sizeof tr);for(int i=1;i<=n;++i){scanf("%d",&a[i]);a[i]^=a[i-1];pre[i]=las[a[i]];las[a[i]]=i;rk[i]=i;}//(pre[i],rk[i]]for(int i=1;i<=q;++i){e[i].id=i;scanf("%d%d",&e[i].l,&e[i].r);}sort(rk+1,rk+n+1,cmp);sort(e+1,e+q+1);now=1;for(int i=1;i<=q;++i){while(now<=n&&pre[rk[now]]>=e[i].l-1){upd(rk[now],rk[now]-pre[rk[now]]);now++;}res[e[i].id]=ask(e[i].r);if(res[e[i].id]>n)res[e[i].id]=-1;}for(int i=1;i<=q;++i)printf("%d\n",res[i]); return 0;
}

牛客练习赛53 E.老瞎眼 pk 小鲜肉(离线+BIT单点修改)相关推荐

  1. 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  2. 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...

  3. 牛客练习赛34 E little w and Digital Root(数位dp)

    title: 牛客练习赛34 E little w and Digital Root(数位dp) date: 2018-12-17 22:38:37 tags: 数位dp categories:ACM ...

  4. 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)

    title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...

  5. 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)

    牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...

  6. 牛客练习赛73 D 离别(线段树+右端点排序离线查询)

    牛客练习赛73 D 离别 思路: 对于每一个固定的右端点i,我们都找到一个区间(l,r)使得区间中的点为左端点时 里面最大的的种数为k. 这个可以用队列或者vector来维护. 然后我们对于q个查询, ...

  7. 牛客练习赛75 D 减数游戏(队列优化(需要取模的)堆)

    牛客练习赛75 D 减数游戏 思路:写一下式子可以发每次选择最小的两个数进行操作,最后得到的答案会是最大的,那我们可以将它放进一个最小堆中来维护,但是里面的数是需要取模的,当它取模的时候,将会变小.那 ...

  8. 妄想集合(牛客练习赛90)

    妄想集合(牛客练习赛90) 题意: 开始有 n 个可重集合,开始时每一个集合中都有一个数,有 m 个操作. Quant l r x\text{Quant l r x}Quant l r x:往编号在 ...

  9. 踩不出足迹(牛客练习赛88 )

    踩不出足迹(牛客练习赛88 ) 题意: 长度为n的数组a,每个数是一个k位二进制 定义一下操作: 令第一次得到的结果为 a1a_1a1​.你需要从第二个数开始,每次可以选择与上一次得到的结果异或或者同 ...

  10. 牛客练习赛29 题解

    牛客练习赛29 A. 可持久化动态图上树状数组维护01背包 题解 这题跟标题没有任何关系- 贪心的使得负数删除的时候下标尽可能大,然后正数的时候下标尽可能小. 观察到每个数下标最大的时候就是它的初始下 ...

最新文章

  1. oracle配置oracle Database Configuration Assistant失败是什么原因?
  2. 统计Apache或Nginx访问日志里的独立IP访问数量的Shell
  3. 【今日CS 视觉论文速览】 11 Jan 2019
  4. akka actor行为切换实现
  5. java 图像处理两例:图像缩放与圆角图片的制作
  6. 计算机网络安全防护教案,计算机网络安全基础教案.DOC
  7. jquery项目源码_第一个jQuery程序
  8. python软件下载对电脑配置要求-python3批量统计用户电脑配置
  9. 电子技术基础数字部分第六版_知识速递 | 数字电子技术基础知识要点
  10. 东京中文离线地图App上线
  11. 串口WriteFile 句柄无效 的解决
  12. 5G技术在物联网行业的应用
  13. 湘潭大学java实验
  14. 自下而上语法制导翻译过程
  15. java微信公众号自动回复文字加图片
  16. 2020.11.29-参加美国数学大联盟Math League初赛(二等奖)
  17. 反射机制-Reflected
  18. 旋转编码器消抖程序设计
  19. 一元线性回归及Excel回归分析
  20. 深入理解JUC的8锁现象

热门文章

  1. git clone大仓库(>1G)时速度慢并出现RPC failed断开连接错误的真正解决方法
  2. 3D游戏角色建模设计这样做,模型满分!
  3. 北漂小斌和你分享宋代建筑模数斗拱材分制的学习方法以及CAD案例图纸
  4. Linux下安装SVN服务(CentOS7下)单仓库版(老威改良版)
  5. mac上传文件到ftp服务器,mac上传文件到ftp服务器
  6. Pi-hole黑洞(广告屏蔽)列表的维护思路
  7. 怎样将vob格式转换成avi高清视频格式
  8. ava程序员职业生涯规划范文
  9. 近来比较有意思的新形式网络广告
  10. ubuntu系统下耳机没声音(已解决)