彼岸花

Description

l s w lsw lsw 的院子里种了 n n n 朵彼岸花,其中第i朵的彼岸花的美丽值为 a i a_i ai ,彼岸花按照编号从小到大从左向右排成了一排。

现在小 l s w lsw lsw m m m 个问题,他每次会给出一个区间 [ l , r ] [l, r] [l,r] ,他想在编号属于区间 [ l , r ] [l, r] [l,r] 的彼岸花中选出两朵花,使得 a i ⨁ a j a_i ⨁ a_j aiaj (⨁ 表示按位异或操作) 的值最大(如果只能选出一朵花请直接输出 0 0 0 )。

Input

第一行两个整数 n , m ( 1 ≤ n , m ≤ 5 × 1 0 3 ) n, m(1≤n,m≤5×10^3) n,m(1n,m5×103)

第二行 n 个整数,分别表示 a 1 , a 2 , … , a n ( 1 ≤ a i ≤ 2 10 ) a_1, a_2, \ldots , a_n (1≤a i ≤ 2^{10} ) a1,a2,,an(1ai210)

接下来 m 行,每行两个整数分别表示一个问题所给出的区间 l , r ( 1 ≤ l ≤ r ≤ n ) l, r(1≤l≤r≤n) l,r(1lrn)

Output

输出 m m m 行,表示每个问题的答案。

Sample Input

10 10
1 2 3 4 5 6 7 8 9 10
1 2
1 3
1 5
2 6
2 8
2 10
3 7
8 10
6 9
1 7

Sample Output

3
3
7
7
15
15
7
3
15
7

解题思路

不难想这是一道动规题

f l , r = f_{l,r}= fl,r= a l a_l al 为其中一个数,在区间 [ l + 1 , r ] [l+1,r] [l+1,r] 里选另外一个数的最大值

则有转移方程 ∑ i = 1 n ∑ j = i + 1 n f i , j = m a x ( f i , j − 1 , a i ⨁ a j ) \sum\limits_{i=1}^n\sum\limits_{j=i+1}^nf_{i,j}=max(f_{i,j-1},a_i ⨁ a_j) i=1nj=i+1nfi,j=max(fi,j1,aiaj)

A C   c o d e AC \ code AC code

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 5;
int n, m;
int a[maxn];
int f[5005][5005];

signed main()
{
    cin >> n >> m;
    //build(1,1,n);
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    f[1][1] = 0;
    for (int i = 1; i <= n; i++)
    {
        for (int j = i + 1; j <= n; j++)
        {
            f[i][j] = max(f[i][j - 1], (a[i] ^ a[j]));
        }
    }
    for (int i = 1; i <= m; i++)
    {
        int l, r;
        cin >> l >> r;
        if (l > r)
            swap(l, r);

        if (r - l == 1)
        {
            cout << f[l][r] << endl;
        }
        else
        {
            int ans = 0;
            for (int j = l; j <= r; j++)
            {
                ans = max(ans, f[j][r]);
            }
            cout << ans << endl;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值