AtCoder-ABC 450 真题解析报告发布

四季读书网 3 0
AtCoder-ABC 450 真题解析报告发布
8点击上面微信号关注我AtCoder-ABC 450 真题解析报告发布 第1张关注我哟定期推送帐号信息学新闻竞赛自主招生信息学专业知识信息学疑难解答信息学训练营信息等诸多优质内容的微信平台,欢迎分享文章给你的朋友或者朋友圈!有任何问题请联系小编!
AtCoder-ABC 450 真题解析报告发布 第2张
    清北名师坐镇!AtCoder Beginner Contest 450题解发布!

【名师加持,实力护航】

本次直播的主讲人吴老师,是清北学堂OI金牌教研团的核心成员,毕业于清华大学,更是斩获过NOI2021银牌的大神级选手。他不仅有着扎实的竞赛理论基础,更具备丰富的实战经验,擅长将复杂的算法问题拆解为通俗易懂的解题思路,帮助无数OIer在竞赛中突破瓶颈,斩获佳绩。

【聚焦AtCoder,直击竞赛核心】

AtCoder作为全球知名的编程竞赛平台,其题目风格灵活多变,涵盖算法、数据结构等多个核心考点,是检验选手编程能力和思维逻辑的绝佳舞台。本次直播中,吴老师将针对AtCoder Beginner Contest 450的所有题目进行逐题精讲:

  • 思路拆解:从题目分析入手,带领大家梳理解题思路,挖掘题目背后隐藏的算法模型;

  • 代码实现:现场编写代码,演示如何将思路转化为高效、简洁的可运行程序;

  • 技巧点拨:分享竞赛中的实用技巧和避坑指南,帮助大家在有限时间内快速提升解题效率。

直播间地址复制下方链接或直接扫描二维码,PC端建议使用chrome浏览器点击“阅读原文”也可查看):

https://live.bilibili.com/21371611?live_from=84002

如不能显示请在哔站搜索栏查找“清北学堂信息学”账号(录播也发布在此)

AtCoder-ABC 450 真题解析报告发布 第3张

欢迎加入ABC交流QQ群咨询、沟通、交流群密码:AtCoder

AtCoder-ABC 450 真题解析报告发布 第4张

ABC450比赛真题讲解

题目列表:

AtCoder-ABC 450 真题解析报告发布 第5张

题目地址:https://atcoder.jp/contests/abc450/tasks

题目讲解:识别下方二维码或点击文末“阅读原文”可查看视频直播解析题解)

ABC450题解及参考程序(文字版)

AtCoder-ABC 450 真题解析报告发布 第6张
AtCoder-ABC 450 真题解析报告发布 第7张
AtCoder-ABC 450 真题解析报告发布 第8张
AtCoder-ABC 450 真题解析报告发布 第9张
AtCoder-ABC 450 真题解析报告发布 第10张

参考程序

A

#include<bits/stdc++.h>usingnamespacestd;intmain(){    int n;scanf("%d",&n);    for(int i = n;i >= 1;--i){        printf("%d%c",i,",\n"[i==1]);    }    // 不输出行末空格 printf("%d%c",xx," \n"[i==end])    // ",\n": 长度为2的字符串,第0个位置是, 第1个位置是\n    // ",\n"[i==1]    // 等价于:    // 1. string s = ",\n"    // 2. s[i==1]    return0;}

B

#include<bits/stdc++.h>usingnamespacestd;constint MAXN = 100 + 5;int C[MAXN][MAXN];int n;intmain(){    scanf("%d",&n);    for(int i = 1;i <= n;++i){        for(int j = i+1;j <= n;++j){            scanf("%d",&C[i][j]);        }    }    for(int a = 1;a <= n;++a){        for(int b = a+1;b <= n;++b){            for(int c = b+1;c <= n;++c){                if(C[a][b] + C[b][c] < C[a][c]){                    puts("Yes");                    return0;                }            }        }    }    puts("No");    return0;}

C

#include<bits/stdc++.h>usingnamespacestd;constint MAXN = 1e3 + 5;char S[MAXN][MAXN];bool vis[MAXN][MAXN];int n,m;constint di[4] = {0,0,1,-1};constint dj[4] = {1,-1,0,0};bool flag;voiddfs(int i,int j){    vis[i][j] = true;    if(i == 1 || i == n || j == 1 || j == m) flag = false;    for(int k = 0;k <= 3;++k){        int ii = i + di[k], jj = j + dj[k];        if(ii < 1 || ii > n || jj < 1 || jj > m || S[ii][jj] == '#' || vis[ii][jj]) continue;        dfs(ii, jj);    }}voidbfs(int si,int sj){    queue<pair<int,int> > que;    que.push({si,sj});vis[si][sj] = true;    while(!que.empty()){        auto [i,j] = que.front();que.pop();        if(i == 1 || i == n || j == 1 || j == m) flag = false;        for(int k = 0;k <= 3;++k){            int ii = i + di[k], jj = j + dj[k];            if(ii < 1 || ii > n || jj < 1 || jj > m || S[ii][jj] == '#' || vis[ii][jj]) continue;            que.push({ii,jj});vis[ii][jj] = true;        }    }}intmain(){    scanf("%d%d",&n,&m);    for(int i = 1;i <= n;++i) scanf("%s",S[i]+1);    int ans = 0;    for(int i = 1;i <= n;++i) for(int j = 1;j <= m;++j){        if(S[i][j] == '#' || vis[i][j]) continue;        flag = true;        bfs(i,j);        if(flag) ++ans;    }    printf("%d\n",ans);    return0;}

D

#include<bits/stdc++.h>usingnamespacestd;constint MAXN = 2e5 + 5;int n,k;int a[MAXN];intmain(){    scanf("%d%d",&n,&k);    for(int i = 1;i <= n;++i) scanf("%d",a+i),a[i] %= k;    sort(a+1,a+n+1);    int ans = a[n]-a[1];    for(int i = 1;i <= n-1;++i){        ans = min(ans, a[i]+k - a[i+1]);    }    printf("%d\n",ans);    return0;}

E

printf("hello w#include <bits/stdc++.h>const int MAXN = 1e5 + 5;#define LL long longLL L[MAXN];// L[i] = |S[i]|LL C[MAXN][26];// C[i][c]: S[i] 中有多少个 cchar X[MAXN], Y[MAXN];int preX[MAXN][26], preY[MAXN][26];// preX/preY[i][c]: X/Y 的前 i 个字符中有多少个 cint q;LL f(LL n, int m, int c){    // S[m] 的前 n 个位置有几个 c    if(n <= 0) return 0;    if(m == 1) return preX[n][c];    if(m == 2) return preY[n][c];    // S[m] = S[m-1] + S[m-2]    if(n <= L[m-1]) return f(n, m-1, c);    else if(n < L[m]) return C[m-1][c] + f(n-L[m-1],m-2,c);    else return C[m][c];}int main(){    scanf("%s%s",X+1,Y+1);    L[1] = strlen(X+1);L[2] = strlen(Y+1);    for(int i = 1;i <= L[1];++i){        memcpy(preX[i], preX[i-1], sizeof(preX[i]));        preX[i][X[i]-'a']++;        C[1][X[i]-'a']++;    }    for(int i = 1;i <= L[2];++i){        memcpy(preY[i], preY[i-1], sizeof(preY[i]));        preY[i][Y[i]-'a']++;        C[2][Y[i]-'a']++;    }    int m0 = 2;    do{        ++m0;        L[m0] = L[m0-1] + L[m0-2];        for(int c = 0;c <= 25;++c) C[m0][c] = C[m0-1][c] + C[m0-2][c];    }while(L[m0] <= 1e18);    scanf("%d",&q);    while(q--){        LL L,R;char tmp[23];        scanf("%lld%lld%s",&L,&R,tmp);        int c = tmp[0] - 'a';        printf("%lld\n", f(R,m0,c)-f(L-1,m0,c));    }    return 0;}#include <bits/stdc++.h>const int MAXN = 1e5 + 5;#define LL long longLL L[MAXN];// L[i] = |S[i]|LL C[MAXN][26];// C[i][c]: S[i] 中有多少个 cchar X[MAXN], Y[MAXN];int preX[MAXN][26], preY[MAXN][26];// preX/preY[i][c]: X/Y 的前 i 个字符中有多少个 cint q;LL f(LL n, int m, int c){    // S[m] 的前 n 个位置有几个 c    if(n <= 0) return 0;    if(m == 1) return preX[n][c];    if(m == 2) return preY[n][c];    // S[m] = S[m-1] + S[m-2]    if(n <= L[m-1]) return f(n, m-1, c);    else if(n < L[m]) return C[m-1][c] + f(n-L[m-1],m-2,c);    else return C[m][c];}int main(){    scanf("%s%s",X+1,Y+1);    L[1] = strlen(X+1);L[2] = strlen(Y+1);    for(int i = 1;i <= L[1];++i){        memcpy(preX[i], preX[i-1], sizeof(preX[i]));        preX[i][X[i]-'a']++;        C[1][X[i]-'a']++;    }    for(int i = 1;i <= L[2];++i){        memcpy(preY[i], preY[i-1], sizeof(preY[i]));        preY[i][Y[i]-'a']++;        C[2][Y[i]-'a']++;    }    int m0 = 2;    do{        ++m0;        L[m0] = L[m0-1] + L[m0-2];        for(int c = 0;c <= 25;++c) C[m0][c] = C[m0-1][c] + C[m0-2][c];    }while(L[m0] <= 1e18);    scanf("%d",&q);    while(q--){        LL L,R;char tmp[23];        scanf("%lld%lld%s",&L,&R,tmp);        int c = tmp[0] - 'a';        printf("%lld\n", f(R,m0,c)-f(L-1,m0,c));    }    return 0;}orld!");

F

#include<bits/stdc++.h>usingnamespacestd;constint MAXN = 2e5 + 5;constint mod = 998244353;int sm[MAXN<<2], tag[MAXN<<2];// tag: 整体乘#define lc ((x)<<1)#define rc ((x)<<1|1)voidcover(int x,int d){    // 在线段树的结点x执行乘d操作    sm[x] = 1ll * sm[x] * d % mod;    tag[x] = 1ll * tag[x] * d % mod;}voidpushdown(int x){    if(tag[x] != 1){        cover(lc, tag[x]);        cover(rc, tag[x]);        tag[x] = 1;    }}voidupdate(int x,int l,int r,int p,int d){    if(l == r) {(sm[x] += d) %= mod;return;}    int mid = (l + r) >> 1;pushdown(x);    if(p <= mid) update(lc,l,mid,p,d);    else update(rc,mid+1,r,p,d);    sm[x] = (sm[lc] + sm[rc])%mod;}voidmodify(int x,int l,int r,int L,int R,int d){    if(l == L && r == R){cover(x,d);return;}    int mid = (l + r) >> 1;pushdown(x);    if(R <= mid) modify(lc,l,mid,L,R,d);    elseif(L > mid) modify(rc,mid+1,r,L,R,d);    else modify(lc,l,mid,L,mid,d), modify(rc,mid+1,r,mid+1,R,d);    sm[x] = (sm[lc] + sm[rc]) % mod;}intquery(int x,int l,int r,int L,int R){    if(l == L && r == R) return sm[x];    int mid = (l + r) >> 1;pushdown(x);    if(R <= mid) return query(lc,l,mid,L,R);    elseif(L > mid) return query(rc,mid+1,r,L,R);    elsereturn (query(lc,l,mid,L,mid) + query(rc,mid+1,r,mid+1,R)) % mod;}int n,m;pair<int,int> edge[MAXN];intmain(){    scanf("%d%d",&n,&m);    for(int i = 0;i < (MAXN<<2);++i) tag[i] = 1;    for(int i = 1;i <= m;++i) scanf("%d%d",&edge[i].first, &edge[i].second);    sort(edge+1,edge+m+1);    // f[0][1] = 1, f[0][*] = 0;    update(1,1,n,1,1);    for(int i = 1;i <= m;++i){        auto [X,Y] = edge[i];        int sm = query(1,1,n,X,Y);        update(1,1,n,Y,sm);        if(X > 1) modify(1,1,n,1,X-1,2);        if(Y < n) modify(1,1,n,Y+1,n,2);    }    printf("%d\n",query(1,1,n,n,n));    return0;}

G

#include<bits/stdc++.h>usingnamespacestd;constint MAXN = 2e5 + 5;constint mod = 998244353;int inv[MAXN], f[MAXN];int N,a[MAXN];intmain(){    inv[1] = 1;    for(int i = 2;i < MAXN;++i) inv[i] = (mod-1ll*(mod/i)*inv[mod%i]%mod)%mod;    scanf("%d",&N);for(int i = 1;i <= N;++i) scanf("%d",a+i);    if(N == 1){        printf("%lld\n",1ll*a[1]*a[1]%mod);        return0;    }    f[2] = 0;    for(int n = 3;n <= N;++n){        int tmp = (1ll*(n-2)*(n-3)%mod*f[n-1]%mod + 2ll*(n-2)%mod) %mod;        tmp = 1ll*tmp*inv[n]%mod*inv[n-1]%mod;        f[n] = tmp;    }    int E = (2ll*f[N]%mod-1+mod)%mod;    int sm = 0, sm2 = 0;    for(int i = 1;i <= N;++i){        (sm += a[i]) %= mod;        (sm2 += 1ll*a[i]*a[i]%mod) %= mod;    }    int cross_sm = (1ll*sm*sm%mod - sm2+mod)%mod;    int ans = (sm2 + 1ll*cross_sm*E%mod)%mod;    printf("%d\n",ans);    return0;}

针对每周六20:00举办的ABC比赛,我们每周日都会对比赛真题进行直播讲解。

直播间地址(点击“阅读原文”也可查看):https://live.bilibili.com/21371611?live_from=84002

AtCoder-ABC 450 真题解析报告发布 第11张

AtCoder-OI初学者最佳题库推荐(附比赛参赛方式介绍)<<<点击查看

AtCoder-ABC 450 真题解析报告发布 第12张
AtCoder-ABC 450 真题解析报告发布 第13张

AtCoder-ABC 450 真题解析报告发布 第14张

往期精选内容

APIO2026 (中国区)活动报名通知

2026年“双一流”大学排名出炉,清北稳居榜首!

2025年五大学科竞赛国家集训队正式公布,260人获清北保送资格

2025年全球大学计算机专业排名发布,中国高校领先AI领域

IOI 2026 中国国家队四名选手的金牌之路!

NOI2026冬令营获奖名单发布

2026 NOI系列活动和认证日历发布,CSP-J/S等竞赛时间公布

定了!2026年全国五大学科竞赛赛程及决赛举办地点确定

最适合信息学初学者题库推荐-AtCoder

信息学竞赛金牌教练-讲述优秀的学生是如何养成的

信息学高手是怎么炼成的 | 入选信息学国家队,被清北保送两次!

西交大少年班考试近日结束,一起来了解国内现有的几个少年班

姚班信息学大牛讲座视频-如何学好信息学竞赛(入门篇)

学好信竞-浅谈信息学竞赛考场策略及程序测试

详细盘点清华姚班 智班,北大 浙大图灵班等多所高校AI专业实力!

再见,OI-大牛HZW亲笔,分享OI生涯记录,不变的是坚持和热爱!

根据信息学竞赛之路带你了解信息学竞赛流程

从搜狗CEO王小川(信息学金牌),看这二十几年中国奥赛金牌的去向

揭晓高薪专业排行榜,计算机专业薪资最高!哪些专业最具潜力?

一个清华保送生妈妈对竞赛的感受,自主招生家长都要看看!

计算机科学与技术专业全国大学排行榜!

为什么这些孩子初中就能被清华北大签约

(1)为什么有“编程思维”和数学能力强的人更优秀?

(2)清北独家录制NOIP成功者说学习视频!!!

(3)我们为什么要对孩子进行编程教育?

(4)信息学竞赛答家长问题

1.信息学竞赛,你想了解的知识都在这里

2.信息学奥赛(NOIP)初赛学习方法推荐

3.信息学奥赛(NOIP)复赛学习方法推荐

4.大牛为你推荐十本最适合信息学竞赛的书籍

5.信息学奥赛有那么重要吗?

6.参加编程竞赛对实际工作的用处

7.清北学堂独家录制NOIP考试技巧讲座

8.在线编程挑战赛第一名:我是这么学算法的

9.信息学竞赛如何学习及准备攻略!

10.凭什么我得了信息学奥赛国家一等奖

11.榜样 | 北大降200分要这个诸暨天才少年

12.OI金牌教练胡芳:爱和成长的故事

13.信息学竞赛,一个让孩子不需要再去挤独木桥的方向

14.北大录取生陈代超:在信息学中找到“思维图谱”

15.国务院发文支持编程教育进入中小学,中国人工智能厚积薄发

关注「信息学竞赛」

看更多信息学趣闻与知识

↓↓

抱歉,评论功能暂时关闭!