2025年信息奥赛选拔试题及答案.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

2025年信息奥赛选拔试题及答案

(满分300分,时长5小时,机试+纸质提交)

【考生注意】

1.语言限定:C++17,禁止__int128、bits/extc++.h等非标准扩展。

2.评测环境:Inteli7-12700K,32GB,Ubuntu22.04,GCC11,O2优化。

3.每题源文件命名与程序名一致,统一放入/home/ioi2025/选手编号/。

4.纸质提交部分须用黑色签字笔书写,字迹潦草视为无效。

5.开赛后30分钟可离场,结束前30分钟禁止离场。

—————————————机试部分(240分)—————————————

1.序列的量子跳跃(QuantumLeap)100分

【题目描述】

给定长度为n的整数序列A,下标1…n。定义一次量子跳跃为:

选择下标i∈[1,n?1],令A[i]与A[i+1]同时变为A[i]⊕A[i+1]。

求最少跳跃次数使得序列整体异或和为0。若不可能,输出?1。

【输入格式】

第一行n(2≤n≤2×10^5),第二行n个32位无符号整数。

【输出格式】

一行,最少次数或?1。

【样例输入】

5

35127

【样例输出】

2

【样例解释】

第一次选i=2,序列变为34427,异或和=2;

第二次选i=4,序列变为34405,异或和=0。

【答案与解析】

令S=⊕_{k=1..n}A[k]。若S=0,答案0。

否则,观察一次跳跃对S的影响:

新S′=S⊕A[i]⊕A[i+1]⊕(A[i]⊕A[i+1])⊕(A[i]⊕A[i+1])=S⊕(A[i]⊕A[i+1])。

即S′=S⊕x,其中x=A[i]⊕A[i+1]。

目标S′=0,等价于x=S。

因此,问题转化为:最少相邻异或操作,使得某次操作产生的x等于初始S。

由于操作可逆,且每次操作仅影响相邻两项,可将序列视为图,边权为A[i]⊕A[i+1]。

BFS求从任意边到S的最短路径即可。

时间复杂度O(n+2^32)显然不可行,注意到边权仅依赖相邻异或值,而n≤2e5,可用哈希表存储出现过的权值,BFS状态数不超过n。

具体实现:

1.预处理所有相邻异或值,存入哈希表并离散化;

2.建图,节点为离散化后的权值,边为“一次跳跃可转移到的权值”;

3.从初始S出发,BFS求最短路径。

若S=0输出0;若S不在离散化表中输出?1;否则输出BFS结果。

核心代码:

```cpp

includebits/stdc++.h

usingnamespacestd;

usingu32=uint32_t;

intmain(){

ios::sync_with_stdio(false);

cin.tie(nullptr);

intn;cinn;

vectoru32a(n+1);

u32S=0;

for(inti=1;i=n;i++){cina[i];S^=a[i];}

if(S==0){cout0;return0;}

unordered_mapu32,intid;inttot=0;

autoget=[](u32x){

if(!id.count(x))id[x]=tot++;

returnid[x];

};

vectorintadj[200005];

for(inti=1;in;i++){

u32x=a[i]^a[i+1];

intu=get(S^x),v=get(x);

adj[u].push_back(v);

}

if(!id.count(S)){cout-1;return0;}

intstart=id[S];

vectorintdis(tot,-1);

queueintq;q.push(start);dis[start]=0;

while(!q.empty()){

intu=q.front();q.pop();

for(intv:adj[u])if(dis[v]==-1){

dis[v]=dis[u]+1;

q.push(v);

}

}

intans=INT_MAX;

for(inti=0;itot;i++)if

您可能关注的文档

文档评论(0)

151****3398 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档