codeforces 984 D. XOR-pyramid
给定函数$f(b)$,以及数组$a$,每次询问$L,R$,找一对$l,r$,满足$L \le l \le r \le R$,最大化$f(a_{l}, a_{l+1}, \cdots , a_{r})$
$1 \le n \le 5000$
$1 \le q \le 100000$
通过大力手玩,可以得知$f(a_{l},a_{l+1}, \cdots , a_{r})=f(a_{l}, \cdots , a_{r-1}) \mathop{xor} f(a_{l+1}, \cdots a_{r})$
然后陷入僵局……不会快速求出这个……直到看到了$1 \le n \le 5000$……
所以可以直接$O(n^2)$的处理出函数在每个区间的值,然后再处理出每个区间的最大函数值
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 5010; 4 int f[N][N], n, ans[N][N]; 5 int main() { 6 scanf("%d", &n); 7 for(int i = 1 ; i <= n ; ++ i) scanf("%d", &f[i][i]), ans[i][i] = f[i][i]; 8 for(int len = 2 ; len <= n ; ++ len) 9 for(int i = 1 ; i + len - 1 <= n ; ++ i) { 10 int j = i + len - 1; 11 f[i][j] = f[i][j - 1] ^ f[i + 1][j]; 12 ans[i][j] = max(f[i][j], max(ans[i + 1][j], ans[i][j - 1])); 13 } 14 scanf("%d", &n); 15 for(int i = 1, l, r ; i <= n ; ++ i) scanf("%d%d", &l, &r), printf("%d\n", ans[l][r]); 16 }