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. iTerm 2 与 oh-my-zsh配合,自定义你的终端。

    参考博客:https://www.cnblogs.com/xishuai/p/mac-iterm2.html 参考博客:https://www.cnblogs.com/sasuke6/p/497607 ...

  2. oracle数据库重要的查询语句

    查看所有数据文件(dbf文件)的存放位置 SQL> select name from v$datafile; 标红色的为默认表空间文件 SQL> select name from v$da ...

  3. spark基本概念整理

    app 基于spark的用户程序,包含了一个driver program和集群中多个executor driver和executor存在心跳机制确保存活3 --conf spark.executor. ...

  4. POST注入之sqlmap

    POST注入方法一加—form跑数据库sqlmap.py -u http://59.63.200.79:8815/Pass-05/index.php —form —dbs跑出数据库后查询表名 假设库名 ...

  5. instanceof读解

    function instance(l,r){ let 0 = r.prototype; let v = l.__proto__; while(true){ if(v === null){ retur ...

  6. 什么是kafka,怎么使用? (3)

    上次我因为在windows上解压一个.gz的包没有解压出来,故需要在linux使用kafka,而且这kafka的快速开始上有个zookeeper的文件配置 所以我感觉有必要把dubbo-zookeep ...

  7. redis缓存优化

    redis缓存优化 一.问题 在Javaweb项目中,如果每次刷新,所有资源都重新从数据库中读取,这样每次效率会很低,在这里可以使用redis非关系型数据库,将一些不经常变化得资源加载进内存中.提高效 ...

  8. 无人机通信协议MAVLink简介

    MAVLink MAVLink(Micro Air Vehicle Link,微型空中飞行器链路通讯协议)是无人飞行器与地面站(Ground Control Station ,GCS)之间通讯,以及无 ...

  9. 洛谷题解 P1134 【阶乘问题】

    原题传送门 题目描述 也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如: 12!=1×2×3×4×5×6×7×8×9×10×11×12=479,001,600 12的阶乘最右边的非零位为6. ...

  10. 论文-MobileNetV2: Inverted Residuals and Linear Bottlenecks

    1.主要创新 1)提出了一种新的layer module:the inverted residual with linear bottleneck, 2)short connect被置于bottlen ...