lg7335 [JRKSJ R1] 异或 题解
本题的标签中含有trie,但是这道题可以不用trie做。
考虑列出本题的dp方程:设表示前个数选了段的答案,为数组的前缀异或和
当不选择第位,使用更新。当选择第位时,枚举选择的区间的左端点,使用更新。
由于本题数据随机,考虑更为优秀的做法。枚举,设,则可以看做随机数列。
显然单调递增,所以假设存在个位置且,那么不用考虑。
利用该性质,设表示左边的第一个大于的点(不存在视为),则对于,可行的决策点为,即不断地执行操作直到所经过的非点所构成的集合。
根据经典结论,这个集合的期望大小为,所以此做法时间复杂度为。
#include<bits/stdc++.h>
using namespace std;
#define N 3010
int g[N][N],n,k,a[N],s[N],tp[N],ans;
long long f[N][N];
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
s[i]=s[i-1]^a[i];
tp[i]=1;
g[i][1]=i-1;
for(int j=i-2;~j;j--){
if((s[i]^s[j])>(s[i]^s[g[i][tp[i]]]))
g[i][++tp[i]]=j;
}
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
f[k][i]=max(f[k][i],f[k][i-1]);
for(int j=1;j<=tp[i];j++)
f[k][i]=max(f[k][i],f[k-1][g[i][j]]+(s[g[i][j]]^s[i]));
}
}
printf("%lld",f[k][n]);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效