牛客练习赛53 老瞎眼 pk 小鲜肉[思维+离线+线段树]

题目大意

给定一个序列,q个查询
查询(l,r)内 异或值=0 的最小区间

题目分析

考虑对序列求一个前缀异或和
那么 每个点找到与自己相同的最近的点的位置,就是每个点作为右端点 =0 的最小区间。

所有的查询区间按照右端点排序

然后我们枚举1,n所有点,在线段树 该店对应左端点的位置插入这个区间长度。
对于所有右端点为i的询问 查询(l,r)区间内的最小值即可

代码详解

#include 
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn =6e5+50;
const int maxm =2e6+60;
int n,q;
struct node
{
	int ans=inf;
	int id;
	int l,r;
}t[maxn];
int a[maxm];
int pre[maxm];
int last[maxm];
int le[maxm];
bool cmp(node a,node b)
{
	if(a.r==b.r) return a.l>b.l;
	return a.r=r) return tree[root].mn;
	else if(st>r||ed

你可能感兴趣的:(数据结构)