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;
}
全部评论

相关推荐

05-21 15:47
门头沟学院 Java
浪漫主义的虹夏:项目有亮点吗,第一个不是纯玩具项目吗,项目亮点里类似ThreadLocal,Redis储存说难听点是花几十分钟绝大部分人都能学会,第二个轮子项目也没体现出设计和技术,想实习先沉淀,好高骛远的自嗨只会害了自己
点赞 评论 收藏
分享
代码飞升:别用口语,后端就写后端,前端就写前端,最后别光后悔
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务