Problem

这题的题意大概是

给出一段长度为\(n\) 的区间

\(q\)次询问求 \(L\)~ \(R\) 这个区间内 最短的一段区间 \(l\)~\(r\)

使得 \(\oplus_{i=l}^{r} a_j= 0\)

\(L<=l<r<=r\)

诶 离线么?树状数组好像不好做啊 因为大多数人只会单点修改区间修改和差分吧

考虑离线+线段树

我们先记录一个 \(sum_i = \oplus_{j=1}^i a_j\)

那么我们用一个类似桶一样的东西 \(pos_i\) 记录上一个出现\(sum_i\) 的位置

显然这题是个单点修改 求区间最小值

考虑移动 右指针 \(r\)

把询问的右端点为\(r\) 的存在一起 这样就省下来一个排序

我们要记录 \(l\) 点对区间的贡献

应该反过来做 考虑 \(sum_j\) 最后一次出现的位置 \(pos_{sum_j}\)

然后对 \(pos_{sum_j}\) 进行单点修改 能保证这个肯定对于\(pos_{sum_j}\)这个点来说向右偏移最小的值使得异或和为0

因为移动的是右端点 右端点往右的区间和当前区间是互为独立的 或者换句话说 右端点往右的区间对当前区间是没有贡献的即对答案不会影响

然后直接大力查询 \(query(l,r)\) 就可以了

#include<bits/stdc++.h>
using namespace std ; int n , q ;
const int N = 5e5 + 5 ;
int sum[N] ;
vector < pair < int , int > > v[N] ;
int mn[N << 2] ;
int pos[N << 2] ;
int used[N] ;
int ans[N << 1] ;
inline void build(int l , int r , int rt) {
mn[rt] = INT_MAX ;
if(l == r) return ;
int mid = l + r >> 1 ;
build(l , mid , rt << 1) ;
build(mid + 1 , r , rt << 1 | 1) ;
}
inline void change(int x , int l , int r , int rt , int val) {
if(l == r) { mn[rt] = val ; return ; }
int mid = l + r >> 1 ;
if(x <= mid) change(x , l , mid , rt << 1 , val) ;
else change(x , mid + 1 , r , rt << 1 | 1 , val) ;
mn[rt] = min(mn[rt << 1] , mn[rt << 1 | 1]) ;
}
inline int query(int a , int b , int l , int r , int rt) {
if(a <= l && r <= b) return mn[rt] ;
int mid = l + r >> 1 ;
int ans = INT_MAX ;
if(a <= mid) ans = min(ans , query(a , b , l , mid , rt << 1)) ;
if(b > mid) ans = min(ans , query(a , b , mid + 1 , r , rt << 1 | 1 )) ;
return ans ;
}
#define fi first
#define se second
signed main() {
scanf("%d %d" , & n , & q) ;
for(register int i = 1 ; i <= n ; i ++) {
int x ; scanf("%d" , & x) ;
sum[i] = sum[i - 1] ^ x ;
}
for(register int i = 1 ; i <= q ; i ++) {
int l , r , id ; scanf("%d %d" , & l , & r) ; id = i ;
v[r].push_back({l , id}) ;
}
build(1 , n , 1) ;
for(register int i = 1 ; i <= n ; i ++) {
pos[sum[i - 1]] = i ;
int p = pos[sum[i]] ;
if(p && ! used[p]) {
change(p , 1 , n , 1 , i - p + 1) ;
used[p] = 1 ;
}
for ( auto x : v[i] ) ans[x.se] = query(x.fi , i , 1 , n , 1) ;
}
for(register int i = 1 ; i <= q ; i ++) printf("%d\n" , ans[i] == INT_MAX ? -1 : ans[i]) ;
return 0 ;
}

牛客练习赛53-E 老瞎眼 pk 小鲜肉的更多相关文章

  1. 牛客练习赛53 E 老瞎眼 pk 小鲜肉 (线段树,思维)

    链接:https://ac.nowcoder.com/acm/contest/1114/E来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言1048 ...

  2. 牛客练习赛53 (E 老瞎眼 pk 小鲜肉) 线段树+离线

    考试的时候切的,类似HH的项链~ code: #include <bits/stdc++.h> #define ll long long #define M 500003 #define ...

  3. 牛客练习赛53 E-老瞎眼pk小鲜肉(思维+线段树+离线)

    前言 听说是线段树离线查询?? 做题做着做着慢慢对离线操作有点感觉了,不过也还没参透,等再做些题目再来讨论离线.在线操作. 这题赛后看代码发现有人用的树状数组,$tql$.当然能用树状数组写的线段树也 ...

  4. 牛客练习赛53 D 德育分博弈政治课 (思维建图,最大流)

    牛客练习赛53 D德育分博弈政治课 链接:https://ac.nowcoder.com/acm/contest/1114/D来源:牛客网 题目描述 德育分学长最近玩起了骰子.他玩的骰子不同,他的骰子 ...

  5. 牛客练习赛53 A 超越学姐爱字符串 (DP)

    牛客练习赛53 超越学姐爱字符串 链接:https://ac.nowcoder.com/acm/contest/1114/A来源:牛客网 超越学姐非常喜欢自己的名字,以至于英文字母她只喜欢" ...

  6. 牛客练习赛53 A-E

    牛客联系赛53 A-E 题目链接:Link A 超越学姐爱字符串 题意: 长度为N的字符串,只能有C,Y字符,且字符串中不能连续出现 C. 思路: 其实就是DP,\(Dp[i][c]\) 表示长度为 ...

  7. 【牛客练习赛53】A-超越学姐爱字符串

    // 题目地址:https://ac.nowcoder.com/acm/contest/1114/A /* 找规律(碰运气) n:1 = 2 n:2 = 3 n:3 = 5 n:4 = 8 ... d ...

  8. 牛客练习赛53 B 美味果冻

    链接:https://ac.nowcoder.com/acm/contest/1114/B来源:牛客 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言10485 ...

  9. 牛客练习赛53 (C 富豪凯匹配串) bitset

    没想到直接拿 bitset 能过 $10^8$~ code: #include <bits/stdc++.h> #define N 1004 #define setIO(s) freope ...

  10. 牛客练习赛53 C 富豪凯匹配串

    思路: bitset的简单题,不幸的是当时的我并不知道bitset, C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间, ...

随机推荐

  1. webpack性能优化

    Webpack优化打包速度以及性能优化 1.跟上技术的迭代(Node.Npm.Yarn) 2.在尽可能少的模块上应用loader 3.Plugin尽可能精简并确保可靠 4.resolve参数合理配置 ...

  2. jsplumb 常用事件

    1. jsPlumb.getAllConnections() 获取所有连接线2. jsPlumb.deleteEveryConnection(); 清空所有连接线3. jsPlumb.deleteCo ...

  3. 自动化测试中,cookie的调用方法。

    以cookie为例 方法一: 将返回的cookie写到setUp()中,每次执行用例之前就会调用一次. 如: class AA(unittest.TestCase): def setUp(self): ...

  4. K8S ? K3S !

    K8S ? K3S ! K3S 踩坑开始 歪比歪比(奇怪的服务器) 服务器选择我熟悉的 Centos K3S内置 Containerd 但是!作为一个服务器使用自然是要用常见的一点的容器 Docker ...

  5. 量化投资学习笔记27——《Python机器学习应用》课程笔记01

    北京理工大学在线课程: http://www.icourse163.org/course/BIT-1001872001 机器学习分类 监督学习 无监督学习 半监督学习 强化学习 深度学习 Scikit ...

  6. Golang中的Slice与数组

    1.Golang中的数组 数组是一种具有固定长度的基本数据结构,在golang中与C语言一样数组一旦创建了它的长度就不允许改变,数组的空余位置用0填补,不允许数组越界. 数组的一些基本操作: 1.创建 ...

  7. mysql 5.7.28 中GROUP BY报错问题 SELECT list is not in GROUP BY clause and contains no

    ----mysql 5.7.28 中GROUP BY报错问题 SELECT list is not in GROUP BY clause and contains no------ 解决方案: sel ...

  8. ts中的装饰器

    // 装饰器一种特殊的类的声明, 扩展类.属性.方法. function logClass(params:any) { console.log(params); // params代表HttpClic ...

  9. thingsboard入坑记(一)本机编译运行

    开发环境: windows10 x64 专业版 工具准备: git 2.16.2 windows命令行版 java jdk 1.8:https://www.cnblogs.com/harmful-ch ...

  10. Android8.0自定义广播接收不到问题

    https://blog.csdn.net/kongqwesd12/article/details/78998151