CF 983B 序列函數
阿新 • • 發佈:2018-09-07
簽到 cstring [1] urn 函數 algorithm 異或和 center scanf
CF 983B 序列函數
一道本校神仙wucstdio出的毒瘤簽到題。
題意:
給你一段序列,求出它們的最大異或和。
解法:
其實這道題並不很難,但讀題上可能會有困難。
其實樣例我是用Python 3才看懂的。。。emmm
遞歸思想,令dp[0][i] = a[i],令dp[i][j] 為 第i層遞歸的第j個連續(i+1)個數的 f() 值,則再將dp[i][j] 更新為 dp[i][j], dp[i-1][j] 、dp[i-1][j-1] 的最大值。則查找 l~r 的最大值時,只需要輸出 dp[r-l][l-1] 即可。
CODE :
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N = 5100; int m,n,a[N]; int xor_sum[N][N]; void work_first() { for(int i = 2 ; i <= n ; i++) { for(int j = i ; j <= n ; j++) { xor_sum[i][j] = xor_sum[i - 1][j - 1] ^ xor_sum[i - 1][j]; } } for(int i = 1 ; i <= n ; i++) { for(int j = i ; j <= n ; j++) { int xor_num = max(xor_sum[i - 1][j - 1] , xor_sum[i - 1][j]); xor_sum[i][j] = max(xor_sum[i][j] , xor_num); } } } void check_them() { scanf("%d",&m); for(int i = 1 ; i <= m ; i++) { int l,r; scanf("%d%d",&l,&r); int ans = xor_sum[r - l + 1][r]; printf("%d\n",ans); } } int main() { freopen("function.in","r",stdin); freopen("function.out","w",stdout); scanf("%d",&n); for(int i = 1 ; i <= n ; i++) { scanf("%d",&a[i]); xor_sum[1][i] = a[i]; } work_first();//預處理 check_them();//查詢 return 0; }
CF 983B 序列函數