XOR-pyramid

题解:
给n个数,询问q次,每次询问给出l,r. [l,r]区间求异或最大值为多少?
所以用dp[l][r]来表示区间l,r的答案
先对他进行预处理,预处理后就可以进行dp了。
递推公式:f[i][j]=max(f[i][j],max(f[i+1][j],f[i][j-1]));

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include<string.h>
#include <list>
#include <set>
#include <unordered_map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <cctype>
#include<iomanip>
#define int long long
#define endl '\n'
using namespace std;
const int maxn = 5010;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const ll mod= 998244353;
using namespace std;
int f[maxn][maxn],a[maxn];
signed main()
{
    int n,m,l,r;
    scanf("%lld",&n,&m);
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    for(int i=n;i;i--)
    {
        for(int j=i;j<=n;j++)
        {
            if(i==j)f[i][j]=a[i];
            else f[i][j]=f[i+1][j]^f[i][j-1];
        }
    }
    for(int i=n;i;i--)for(int j=i;j<=n;j++)if(i!=j)f[i][j]=max(f[i][j],max(f[i+1][j],f[i][j-1]));
    scanf("%lld",&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%lld%lld",&l,&r);
        printf("%lld\n",f[l][r]);
    }
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务