牛客练习赛53 E.老瞎眼 pk 小鲜肉(离线+BIT单点修改)
题目
老瞎眼有一个长度为 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单点修改)相关推荐
- 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...
- 牛客练习赛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 ...
- 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)
title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...
- 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)
牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...
- 牛客练习赛73 D 离别(线段树+右端点排序离线查询)
牛客练习赛73 D 离别 思路: 对于每一个固定的右端点i,我们都找到一个区间(l,r)使得区间中的点为左端点时 里面最大的的种数为k. 这个可以用队列或者vector来维护. 然后我们对于q个查询, ...
- 牛客练习赛75 D 减数游戏(队列优化(需要取模的)堆)
牛客练习赛75 D 减数游戏 思路:写一下式子可以发每次选择最小的两个数进行操作,最后得到的答案会是最大的,那我们可以将它放进一个最小堆中来维护,但是里面的数是需要取模的,当它取模的时候,将会变小.那 ...
- 妄想集合(牛客练习赛90)
妄想集合(牛客练习赛90) 题意: 开始有 n 个可重集合,开始时每一个集合中都有一个数,有 m 个操作. Quant l r x\text{Quant l r x}Quant l r x:往编号在 ...
- 踩不出足迹(牛客练习赛88 )
踩不出足迹(牛客练习赛88 ) 题意: 长度为n的数组a,每个数是一个k位二进制 定义一下操作: 令第一次得到的结果为 a1a_1a1.你需要从第二个数开始,每次可以选择与上一次得到的结果异或或者同 ...
- 牛客练习赛29 题解
牛客练习赛29 A. 可持久化动态图上树状数组维护01背包 题解 这题跟标题没有任何关系- 贪心的使得负数删除的时候下标尽可能大,然后正数的时候下标尽可能小. 观察到每个数下标最大的时候就是它的初始下 ...
最新文章
- oracle配置oracle Database Configuration Assistant失败是什么原因?
- 统计Apache或Nginx访问日志里的独立IP访问数量的Shell
- 【今日CS 视觉论文速览】 11 Jan 2019
- akka actor行为切换实现
- java 图像处理两例:图像缩放与圆角图片的制作
- 计算机网络安全防护教案,计算机网络安全基础教案.DOC
- jquery项目源码_第一个jQuery程序
- python软件下载对电脑配置要求-python3批量统计用户电脑配置
- 电子技术基础数字部分第六版_知识速递 | 数字电子技术基础知识要点
- 东京中文离线地图App上线
- 串口WriteFile 句柄无效 的解决
- 5G技术在物联网行业的应用
- 湘潭大学java实验
- 自下而上语法制导翻译过程
- java微信公众号自动回复文字加图片
- 2020.11.29-参加美国数学大联盟Math League初赛(二等奖)
- 反射机制-Reflected
- 旋转编码器消抖程序设计
- 一元线性回归及Excel回归分析
- 深入理解JUC的8锁现象