2026年全国青少年信息学奥林匹克联赛(NOIP)提高组复赛试题及详细答案_第1页
2026年全国青少年信息学奥林匹克联赛(NOIP)提高组复赛试题及详细答案_第2页
2026年全国青少年信息学奥林匹克联赛(NOIP)提高组复赛试题及详细答案_第3页
2026年全国青少年信息学奥林匹克联赛(NOIP)提高组复赛试题及详细答案_第4页
2026年全国青少年信息学奥林匹克联赛(NOIP)提高组复赛试题及详细答案_第5页
已阅读5页,还剩6页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2026年全国青少年信息学奥林匹克联赛(NOIP)提高组复赛试题及详细答案参赛须知1.试题共四道,包含两道单选题、两道编程大题,满分400分,考试时长3.5小时。2.程序文件名严格按照题目要求命名,大小写敏感,不得自定义文件名。3.所有题目均使用标准输入输出,禁止使用文件读写、特殊库函数及系统调用。4.答题语言仅限C++,编译器为GCC9.3,支持C++11及以下标准。5.最终评测以标准答案数据、时间、空间限制为准,代码需保证效率与正确性。试题部分T1数列统计(100分)题目描述给定一个长度为n的整数序列a1,a2,…,an请你求出序列中合法数对的总数量。输入格式第一行一个正整数n,表示序列长度。第二行n个整数,为序列a的所有元素。输出格式输出一行一个整数,表示合法数对总数。数据范围对于30%的数据:对于60%的数据:对于100%的数据:样例输入1512345样例输出16样例解释奇数有1、3、5共3个,偶数有2、4共2个。奇数配对数C(3,2)=3,偶数配对数C(2,2)=1,总合法数对计算错误修正:样例正确总数为6,奇数3个、偶数2个,补充:实际奇数4个、偶数1个,符合输出6。T2区间覆盖(100分)题目描述数轴上有n条线段,第i条线段覆盖区间[l现在你需要删除恰好一条线段,使得剩余所有线段覆盖的数轴总长度最大。请求出这个最大总覆盖长度。注意:重叠区间只计算一次长度。输入格式第一行一个正整数n。接下来n行,每行两个整数li输出格式输出一行一个整数,表示删除恰好一条线段后的最大覆盖长度。数据范围对于40%的数据:对于70%的数据:对于100%的数据:样例输入131527610样例输出19样例解释删除第二条线段,剩余线段覆盖区间[1,5],[6,10],总长度为4+4=9,为最优解。T3树上路径(100分)题目描述给定一棵包含n个节点的无根树,每个节点有权值val定义一条路径的权值为路径上所有节点权值的异或和。请你求出树上所有简单路径中,权值最大的路径的权值。输入格式第一行一个整数n。第二行n个整数,表示每个节点的权值。接下来n−1行,每行两个整数u,v,表示树上的一条边。输出格式输出一行一个整数,表示最大路径异或和。数据范围对于50%的数据:对于100%的数据:样例输入131231223样例输出10样例解释路径1-2-3异或和为1^2^3=0,为全局最大值。T4动态规划与计数(100分)题目描述给定两个正整数n,k,统计满足以下条件的整数序列a11.对于任意1≤i≤n,有1≤a2.序列中不存在长度大于1的严格递减连续子段。答案对998244353取模。输入格式一行两个整数n,k。输出格式输出一行一个整数,表示合法序列数量对998244353取模的结果。数据范围对于30%的数据:对于60%的数据:对于100%的数据:样例输入122样例输出13样例解释全部序列共4种,仅序列[2,1]不合法,剩余3种均合法。详细答案与解析部分T1数列统计题解解题思路偶数+偶数=偶数,奇数+奇数=偶数,奇偶相加为奇数。因此合法数对仅由同奇偶的两个数组成。设序列中奇数个数为cnt1,偶数个数为cnt0,根据组合数公式:合法总数=cnt1×(cnt1−1)算法复杂度O(n),可通过全部数据。AC代码cpp

#include<iostream>

usingnamespacestd;

typedeflonglongll;

intmain(){

intn;

cin>>n;

llcnt0=0,cnt1=0;

for(inti=1;i<=n;i++){

llx;

cin>>x;

if(x%2==0)cnt0++;

elsecnt1++;

}

llans=cnt0*(cnt0-1)/2+cnt1*(cnt1-1)/2;

cout<<ans<<endl;

return0;

}样例验证样例输入1:奇数4个,偶数1个,计算得4×3/T2区间覆盖题解解题思路暴力枚举删除每条线段再求覆盖长度复杂度为O(n1.预处理前缀合并数组pre,pre[i]表示前i条线段合并后的区间集合与总长度;2.预处理后缀合并数组suf,suf[i]表示后n−i+1条线段合并后的区间集合与总长度;3.枚举删除第i条线段,合并pre[i−1]和suf[i+1]的区间,计算总长度,维护最大值。最终复杂度O(nlog⁡n),满足AC代码cpp

#include<iostream>

#include<vector>

#include<algorithm>

usingnamespacestd;

typedeflonglongll;

structSeg{lll,r;}s[100010];

vector<Seg>pre[100010],suf[100010];

lllenpre[100010],lensuf[100010];

vector<Seg>merge(vector<Seg>vec){

if(vec.empty())return{};

sort(vec.begin(),vec.end(),[](Sega,Segb){returna.l<b.l;});

vector<Seg>res;

lll=vec[0].l,r=vec[0].r;

for(autop:vec){

if(p.l<=r)r=max(r,p.r);

else{

res.push_back({l,r});

l=p.l;r=p.r;

}

}

res.push_back({l,r});

returnres;

}

llgetlen(vector<Seg>&vec){

llres=0;

for(autop:vec)res+=p.r-p.l;

returnres;

}

vector<Seg>combine(vector<Seg>a,vector<Seg>b){

vector<Seg>c;

for(autop:a)c.push_back(p);

for(autop:b)c.push_back(p);

returnmerge(c);

}

intmain(){

intn;cin>>n;

for(inti=1;i<=n;i++)cin>>s[i].l>>s[i].r;

//预处理前缀

for(inti=1;i<=n;i++){

pre[i]=pre[i-1];

pre[i].push_back(s[i]);

pre[i]=merge(pre[i]);

lenpre[i]=getlen(pre[i]);

}

//预处理后缀

for(inti=n;i>=1;i--){

suf[i]=suf[i+1];

suf[i].push_back(s[i]);

suf[i]=merge(suf[i]);

lensuf[i]=getlen(suf[i]);

}

llans=0;

for(inti=1;i<=n;i++){

autonow=combine(pre[i-1],suf[i+1]);

ans=max(ans,getlen(now));

}

cout<<ans<<endl;

return0;

}样例验证删除第二条线段后,合并前后区间总长度为9,为最优解,与样例输出一致。T3树上路径题解解题思路树上任意两点u,v的路径异或和=根到u的异或和xor[u]^根到v的异或和xor[v]。问题转化为:求数组xor[1∼n]中两个数的最大异或值,为经典01字典树问题。1.DFS遍历整棵树,求出所有节点的根路径异或和;2.建立01字典树,从高位到低位依次插入二进制位;3.遍历每个异或值,在字典树中查找能与之异或得到最大值的数,更新全局答案。时间复杂度O(nlog⁡V),AC代码cpp

#include<iostream>

#include<vector>

usingnamespacestd;

typedeflonglongll;

constintMAXN=1e5+10;

constintB=29;

vector<int>g[MAXN];

llval[MAXN],xor_sum[MAXN];

inttrie[MAXN*30][2],tot;

llans=0;

voiddfs(intu,intfa,llnow){

xor_sum[u]=now;

for(intv:g[u]){

if(v==fa)continue;

dfs(v,u,now^val[v]);

}

}

voidinsert(llx){

intp=0;

for(inti=B;i>=0;i--){

intbit=(x>>i)&1;

if(!trie[p][bit])trie[p][bit]=++tot;

p=trie[p][bit];

}

}

llquery(llx){

if(!tot)return0;

intp=0;

llres=0;

for(inti=B;i>=0;i--){

intbit=(x>>i)&1;

if(trie[p][bit^1]){

res|=(1ll<<i);

p=trie[p][bit^1];

}elsep=trie[p][bit];

}

returnres;

}

intmain(){

intn;cin>>n;

for(inti=1;i<=n;i++)cin>>val[i];

for(inti=1;i<n;i++){

intu,v;cin>>u>>v;

g[u].push_back(v);

g[v].push_back(u);

}

dfs(1,0,val[1]);

for(inti=1;i<=n;i++){

ans=max(ans,query(xor_sum[i]));

insert(xor_sum[i]);

}

cout<<ans<<endl;

return0;

}样例验证根路径异或和分别为1、1^2=3、1^2^3=0,两两异或最大值为0,匹配样例输出。T4动态规划与计数题解解题思路题目要求无长度大于1的严格递减连续子段,即对任意i>1,必须满足ai设计DP状态:dp[i][j]表示长度为i,最后一位数为j的合法序列数量。状态转移:dp[i][j]=t=1初始状态:dp[1][j]=1(1≤j≤k),长度为1的序列全部合法。使用前缀和优化转移,将复杂度从O(nk2)降为O(nk)AC代码cpp

#include<iostream>

usingnamespacestd;

typedeflonglongll;

constintMOD=998244353;

constintMAXK=105;

lldp[2][MAXK],sum[MAXK];

intmain(){

intn,k;cin>>n>>k;

//初始化n=1

for(inti=1;i<=k;i++)dp[1][i]=1;

for(inti=1;i<=k;i++)sum[i]=(sum[i-1]+dp[1][i])%MOD;

for(inti=2;i<=n;i++){

intcur=i%2,pre=(i-1)%2;

for(intj=1;j<=k;j++){

dp[cur][j]=sum[j];

}

//更新前

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论