# Codeforces-984D - XOR-pyramid - 思维

## 题解链接：

https://www.lucien.ink/archives/212/

## 题目链接：

http://codeforces.com/contest/984/problem/D

## 题目：

For an array b b $b$ of length $m$$m$ we define the function f f $f$ as

where $⊕$ is bitwise exclusive OR.

For example,$f\left(1,2,4,8\right)=f\left(1\oplus 2,2\oplus 4,4\oplus 8\right)=f\left(3,6,12\right)=f\left(3\oplus 6,6\oplus 12\right)=f\left(5,10\right)=f\left(5\oplus 10\right)=f\left(15\right)=15$$f(1,2,4,8)=f(1⊕2,2⊕4,4⊕8)=f(3,6,12)=f(3⊕6,6⊕12)=f(5,10)=f(5⊕10)=f(15)=15$

You are given an array a a $a$ and a few queries. Each query is represented as two integers $l$$l$ and r r $r$. The answer is the maximum value of $f$$f$ on all continuous subsegments of the array al,al+1,,ar a l , a l + 1 , … , a r $a_l,a_{l+1},…,a_r$.

### Input

The first line contains a single integer n (1n5000) n   ( 1 ≤ n ≤ 5000 ) $n\ (1≤n≤5000)$ — the length of a a $a$.

The second line contains nn integers $a_1,a_2,…,a_n\ (0≤ai≤2^{30}-1)$ — the elements of the array.

The third line contains a single integer q (1q100 000) q   ( 1 ≤ q ≤ 100   000 ) $q\ (1≤q≤100\ 000)$ — the number of queries.

Each of the next q q $q$ lines contains a query represented as two integers $l, r\ (1≤l≤r≤n)$.

### Output

Print q q $q$ lines — the answers for the queries.

## 题意：

定义一个函数$f\left(b\right)$$f(b)$ b b $b$对应一个数组，作用方式见题意。给你一个长度为n的序列b，然后给你q次询问，对于每次询问，给你l r，问你在$\left[l,r\right]$$[l,r]$这段区间内所有子串中 f f $f$的最大值为多少。

## 思路：

我开始看这道题的时候还剩20分钟了，然而小伙伴已经思考了很久了…并且发现了一个十分关键的性质。

定义$f\left[l\right]\left[r\right]$$f[l][r]$为在 [l,r] [ l , r ] $[l,r]$这个区间内函数 f f $f$的结果，那么有：

于是我们可以根据这个性质 O(n2) O ( n 2 ) $O(n^2)$预处理出所有区间的 f f $f$，与此同时可以把答案离线下来，然后$O\left(1\right)$$O(1)$出答案即可。

## 实现：

#include <bits/stdc++.h>
int f[5007][5007], ans[5007][5007], n, q, l, r, i;
int main() {
for (scanf("%d", &n), i = 1; i <= n; i++) scanf("%d", f[i] + i), ans[i][i] = f[i][i];
for (int len = 2; len <= n; len++)
for (l = 1, r; (r = l + len - 1) <= n; l++) {
f[l][r] = f[l][r - 1] ^ f[l + 1][r];
ans[l][r] = std::max(f[l][r], std::max(ans[l][r - 1], ans[l + 1][r]));
}
for (scanf("%d", &q), i = 0; i < q; i++) {
scanf("%d%d", &l, &r);
printf("%d\n", ans[l][r]);
}
return 0;
}
11-12 160

08-04 1万+
05-16 313
05-16 179
05-21 126
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客