
【名师加持,实力护航】
本次直播的主讲人吴老师,是清北学堂OI金牌教研团的核心成员,毕业于清华大学,更是斩获过NOI2021银牌的大神级选手。他不仅有着扎实的竞赛理论基础,更具备丰富的实战经验,擅长将复杂的算法问题拆解为通俗易懂的解题思路,帮助无数OIer在竞赛中突破瓶颈,斩获佳绩。
【聚焦AtCoder,直击竞赛核心】
AtCoder作为全球知名的编程竞赛平台,其题目风格灵活多变,涵盖算法、数据结构等多个核心考点,是检验选手编程能力和思维逻辑的绝佳舞台。本次直播中,吴老师将针对AtCoder Beginner Contest 450的所有题目进行逐题精讲:
思路拆解:从题目分析入手,带领大家梳理解题思路,挖掘题目背后隐藏的算法模型;
代码实现:现场编写代码,演示如何将思路转化为高效、简洁的可运行程序;
技巧点拨:分享竞赛中的实用技巧和避坑指南,帮助大家在有限时间内快速提升解题效率。
直播间地址(复制下方链接或直接扫描二维码,PC端建议使用chrome浏览器点击“阅读原文”也可查看):
https://live.bilibili.com/21371611?live_from=84002
如不能显示请在哔站搜索栏查找“清北学堂信息学”账号(录播也发布在此)

欢迎加入ABC交流QQ群咨询、沟通、交流(群密码:AtCoder)
ABC450比赛真题讲解
题目列表:

题目地址:https://atcoder.jp/contests/abc450/tasks
题目讲解:识别下方二维码或点击文末“阅读原文”可查看视频直播解析题解)
ABC450题解及参考程序(文字版)





参考程序
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 个位置有几个 cif(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 个位置有几个 cif(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-OI初学者最佳题库推荐(附比赛参赛方式介绍)<<<点击查看
往期精选内容
2025年五大学科竞赛国家集训队正式公布,260人获清北保送资格
2026 NOI系列活动和认证日历发布,CSP-J/S等竞赛时间公布
信息学高手是怎么炼成的 | 入选信息学国家队,被清北保送两次!
详细盘点清华姚班 智班,北大 浙大图灵班等多所高校AI专业实力!
再见,OI-大牛HZW亲笔,分享OI生涯记录,不变的是坚持和热爱!
从搜狗CEO王小川(信息学金牌),看这二十几年中国奥赛金牌的去向
揭晓高薪专业排行榜,计算机专业薪资最高!哪些专业最具潜力?
计算机科学与技术专业全国大学排行榜!
关注「信息学竞赛」
看更多信息学趣闻与知识
↓↓↓