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 }
codeforces 984 D. XOR-pyramid
posted @ 2018-08-13 07:29  KingSann  阅读(112)  评论(0编辑  收藏  举报