Codeforces Round #483 (Div. 2) D. XOR-pyramid(dp)
阿新 • • 發佈:2019-02-04
題意:
定義一個函式f(b),b對應一個數組,作用方式見題意。給你一個長度為n的序列b,然後給你q次詢問,對於每次詢問,給你l r,問你在[l,r]這段區間內所有子串中f的最大值為多少。
解析:定義f[l][r]為在[l,r]這個區間內函式f的結果,那麼有:
當l=r時f[l][r]=b[l]
否則 f[l][r]=f[l][r−1]⊕f[l+1][r]
所以我們可以按長度列舉
求出f[l][r]並更新ans[l][r]
影響ans[l][r]的值三個
f[l][r] 和ans[l][r-1]以及ans[l+1][r];(也就是當前長度-1的子區間)
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define inf 0x3f3f3f3f
#define pll pair<ll,ll>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep1(i,a,b) for(int i=a;i>=b;i--)
#define rson rt<<1|1,m+1,r
#define lson rt<<1,l,m
using namespace std;
const int N=5e3+100;
ll ans[N][N];
ll f[N][N];
int main()
{
#ifdef LOCAL_DEFINE
freopen("D:\\rush.txt","r",stdin);
#endif
ios::sync_with_stdio(false),cin.tie(0);
ll n,q,l,r;
cin>>n;
rep(i,1,n)
cin>>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] = max(f[l][r],max(ans[l][r-1], ans[l+1][r]));
}
cin>>q;
while(q--)
{
cin>>l>>r;
cout<<ans[l][r]<<endl;
}
return 0;
}