Codeforces-984D - XOR-pyramid - 思维

91 篇文章 0 订阅

题解链接:

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


题目链接:

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


题目:

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

(1)f(b){b[1],if m=1f(b[1]b[2],b[2]b[3],,b[m1]b[m])otherwise

where is bitwise exclusive OR.

For example,f(1,2,4,8)=f(12,24,48)=f(3,6,12)=f(36,612)=f(5,10)=f(510)=f(15)=15

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

Input

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

The second line contains nn integers a1,a2,,an (0ai2301) — the elements of the array.

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

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

Output

Print q q lines — the answers for the queries.


题意:

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


思路:

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

  定义f[l][r]为在 [l,r] [ l , r ] 这个区间内函数 f f 的结果,那么有:

(2)f[l][r]{b[l],if l=rf[l][r1]f[l+1][r]otherwise

  于是我们可以根据这个性质 O(n2) O ( n 2 ) 预处理出所有区间的 f f ,与此同时可以把答案离线下来,然后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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值