1. 程式人生 > >Codeforces Round #483 (Div. 2) D. XOR-pyramid(dp)

Codeforces Round #483 (Div. 2) D. XOR-pyramid(dp)

題意:
  定義一個函式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; }