传送门

给定长度为nnn的数组,qqq个询问

每次问[L,R][L,R][L,R]内最小的区间长度[l,r][l,r][l,r]使得al⊕al+1...⊕ar=0a_l\oplus a_{l+1}...\oplus a_{r}=0al​⊕al+1​...⊕ar​=0


明显需要预处理

如果做一个异或前缀和pre[x]pre[x]pre[x]

那么问题就转化为[L−1,R][L-1,R][L−1,R]找到最小的区间[l,r][l,r][l,r]满足pre[l]⊕pre[r]pre[l]\oplus pre[r]pre[l]⊕pre[r]

此时区间为[l+1,r][l+1,r][l+1,r]

就是找两个最相近的数,似乎不是很好弄

考虑离线做法,如果按照rrr端点排序

那就维护一个变量ididid一路加到rrr去,期间一直更新前面那些相同的数

也就是让w[i]w[i]w[i]表示aia_iai​和右边第一个和aia_iai​相同的数的距离

放在线段树上取最小值即可,这样保证答案一定在[L,R][L,R][L,R]中

因为按照RRR排序,所以端点rrr满足

因为查询线段树实在[L,R][L,R][L,R],所以左端点也满足

#include <bits/stdc++.h>
using namespace std;
#define mid (l+r>>1)
#define ls (rt<<1)
#define rs (rt<<1|1)
#define lson ls,l,mid
#define rson rs,mid+1,r
const int maxn = 2e6+10;
const int inf = 1e9;
struct p
{int l,r,id;bool operator < (const p&tmp )   const{ return r<tmp.r; }
}d[maxn]; int a[maxn],last[maxn];
int w[maxn],n,q,ans[maxn];
void build(int rt,int l,int r)
{w[rt] = inf;if( l==r )  return;build(lson); build(rson);
}
void update(int rt,int l,int r,int index,int val)
{if( l>index||r<index )   return;if( l==r&&l==index ) { w[rt]=min( w[rt],val); return; }update(lson,index,val); update(rson,index,val);w[rt] = min( w[ls],w[rs] );
}
int ask(int rt,int l,int r,int L,int R)
{if( l>=L&&r<=R )   return w[rt];if( l>R||r<L )   return inf;return min( ask(lson,L,R),ask(rson,L,R) );
}
int main()
{cin >> n >> q;for(int i=2;i<=n+1;i++){scanf("%d",&a[i]); a[i]^=a[i-1];}for(int i=1;i<=q;i++) { scanf("%d%d",&d[i].l,&d[i].r ); d[i].r++; d[i].id = i;}sort( d+1,d+1+q );int num = 1;build(1,1,n+1);for(int i=1;i<=q;i++){while( num<=d[i].r ){if( last[a[num]] )    update(1,1,n,last[a[num]],num-last[a[num]] );last[a[num]] = num; num++;}ans[d[i].id] = ask(1,1,n,d[i].l,d[i].r );}for(int i=1;i<=q;i++){if( ans[i]==inf )  ans[i] = -1;cout << ans[i] << endl;}
}

牛客练习赛53.老瞎眼 pk 小鲜肉(线段树思维)相关推荐

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

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

  2. 牛客练习赛26 E-树上路径 (树链剖分+线段树)

    链接:https://ac.nowcoder.com/acm/contest/180/E 来源:牛客网 树上路径 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语 ...

  3. 牛客多校6 - Josephus Transform(线段树求k-约瑟夫环+置换群的幂)

    题目链接:点击查看 题目大意:给出一个长度为 n 的排列,初始时为 1 , 2 , 3 ... n - 1 , n,现在有 m 次操作,每次操作表示为 ( k , x ) ,即进行 x 次 k-约瑟夫 ...

  4. 【牛客 - 370A】签到题(线段树扫描线 或 STLset)(求线段并)

    题干: 链接:https://ac.nowcoder.com/acm/contest/370/A 来源:牛客网 恭喜你找到了本场比赛的签到题! 为了让大家都有抽奖的机会,只需要复制粘贴以下代码(并且稍 ...

  5. 2019 牛客多校 C Governing sand 线段树

    链接:https://ac.nowcoder.com/acm/contest/887/C 来源:牛客网 Governing sand 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 6 ...

  6. 2021牛客多校4 - Tree Xor(线段树+异或区间拆分)

    题目链接:点击查看 题目大意:给出一棵 nnn 个点组成的树,每个点权的取值范围是 [li,ri][l_i,r_i][li​,ri​],每条边权代表的是两点的异或值,现在问这棵树有多少种有效赋值 题目 ...

  7. 牛客多校8 - All-Star Game(线段树分治+并查集按秩合并的撤销操作)

    题目链接:点击查看 题目大意:有 n 个球员和 m 个球迷,一个球员可能是多个球迷的粉丝,需要选择最少的球员进行比赛,使得所有的球迷都愿意观看(对于每个球迷来说,都有至少一个其喜欢的球员入选比赛) 对 ...

  8. 牛客 - 牛牛的Link Power II(线段树)

    题目链接:点击查看 题目大意:给出一个01字符串 s ,现在规定每两个 1 的贡献为其在字符串中的距离,现在有 m 次操作,每次操作会把一个位置将 0 变成 1 或者将 1 变成 0 ,问每次操作后字 ...

  9. 牛客-小H的询问(线段树)

    原题链接:更好的阅读体验 题目描述 小H给你一个数组{a},要求支持以下两种操作: 0 l r(1<=l<=r<=n),询问区间[l,r]中权值和最大的有效子区间的权值和,一个子区间 ...

  10. 牛客练习赛10 B栈和排序【思维】

    题目描述 给你一个1->n的排列和一个栈,入栈顺序给定 你要在不打乱入栈顺序的情况下,对数组进行从大到小排序 当无法完全排序时,请输出字典序最大的出栈序列 输入描述: 第一行一个数n 第二行n个 ...

最新文章

  1. linux oracle脚本编写,Linux 脚本编写基础(一)--语法
  2. ThinkPHP V5 漏洞利用
  3. 人工蜂群算法python_教程 | 用人工蜂群算法求解k-分区聚类问题
  4. Linux入门:usermod - 修改用户帐户信息
  5. Windows XP SP3细节官方详解
  6. 项目总结【Excel中附件导出和导入】
  7. YASKAWA 机器人开发
  8. 俄勒冈之旅_欢迎美好的一天俄勒冈观众-消灭糖尿病2007
  9. 计算机网络的共享如何关闭,怎么查看并关闭网络共享
  10. 智慧城市大屏可视化(Axure高保真原型)
  11. 2018 icpc 焦作站 自闭记
  12. HR website
  13. 关于数据库账号和密码加密问题
  14. 【攀爬者系列】北冥神功之归并算法(十七式)
  15. 漫威电影宇宙的正确观影顺序
  16. 校园网、CMCC自动登录
  17. 电脑与手机文件互传机制
  18. sshpass报错Host key verification failed
  19. 05_Java筑基之Java开发初体验
  20. 很不错的刷Alexa排名的网站(转)

热门文章

  1. 《冰河世纪》特效指导罗皓做客【ftrack聊天室】
  2. 丑数java_丑数-Java研发军团
  3. 程序员必须收藏的网站整理(持续更新)
  4. erp系统软件的三层定义
  5. matlab trapz二重积分函数_用MATLAB计算某些区域上的二重积分666.doc
  6. 商务网站建设与维护【4】
  7. 一北大毕业生的返乡报告:家乡面目全非 备感无力
  8. port ‘pi_data‘ not found in module ‘dcfifo‘
  9. Java工程师的职业规划(最全版本)
  10. getMonthsetMonth方法