专栏文章
题解:CF2071D1 Infinite Sequence (Easy Version)
CF2071D1题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minygg9b
- 此快照首次捕获于
- 2025/12/02 10:24 3 个月前
- 此快照最后确认于
- 2025/12/02 10:24 3 个月前
异或前缀和 + 性质挖掘 + 递归
设 数组为 数组的异或前缀和,即 。
显然当 时直接输出 即可。所以本题难点自然是在于 的部分如何求。
由题意当 时,。
当 为奇数时:显然 ,又当 时 ,故当 且 为奇数时有 。
根据 数组的递推定义:。结合刚刚分析的性质,当 为奇数且 时:有 ,为了用上这个条件于是将 转化为 ,而 ,故 。
即对于所有 的奇数项都相等。(因为当 为偶数时, 均相等;当 为奇数时, 均相等。)
接着考虑当 且 为偶数时:,因为 ,故 ,其中 是确定的值,就等于第一个 的奇数项对应的值,而 则可继续递归得到,显然递归层数最多也只有 层。
时间复杂度 。
CPP#define rep(x,y,z) for(int x=y;x<=z;x++)
typedef long long LL;
const int N=2e5+5;
LL n,l,r;
int a[N];
LL prexor[N];
LL dfs(LL now){ // 递归首层求>n的now对应的值a[now],由于a[now]=prexor[now/2],进而不断递归求解
if(now<=n) return prexor[now];
else if(now/2<=n) return dfs(now/2);
now/=2;
LL odd;
if(n&1) odd=prexor[n];
else odd=prexor[n]^dfs(n+1);
if(now&1) return odd;
else return odd^dfs(now);
}
void solve(){
cin>>n>>l>>r;
rep(i,1,n) cin>>a[i];
rep(i,1,n) prexor[i]=prexor[i-1]^a[i];
if(l<=n) return cout<<a[l],void();
cout<<dfs(l);
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...