关注我哟定期推送帐号信息学新闻,竞赛自主招生,信息学专业知识,信息学疑难解答,信息学训练营信息等诸多优质内容的微信平台, 欢迎分享文章给你的朋友或者朋友圈! 有任何问题请联系小编!
AtCoder (ABC 379)比赛于上周六晚(20:00)进行,今天为大家带来本次比赛的视频讲解,文字版题目解析及参考代码。
AtCoder (ABC 380)比赛于本周六(11月16日)晚20:00进行,同学们参与比赛后可在本周日(11月17日)晚 19:00进入继续到直播间观看题目解析。
欢迎加入ABC交流QQ群咨询、沟通、交流(群密码:AtCoder)
ABC379比赛真题讲解
题目列表:
题目地址:https://atcoder.jp/contests/abc379/tasks
ABC379题解(文字版)
►A代码
参考代码
B代码
charstr[ 105]; intn,k;
intmain{ scanf( "%d%d",&n,&k); scanf( "%s",str+ 1); intans = 0;
intlen = 0; for( inti = 1;i <= n;++i){ if(str[i] == 'X'){ // 产生了一个连续段ans += len/k;len = 0; }else{ len++;}}ans += len/k;
printf( "%d\n",ans); return0; }
C代码
usingnamespacestd; constintMAXN = 2e5+ 5;
pair< int, int> a[MAXN]; intn,m;
intmain{ scanf( "%d%d",&n,&m); for( inti = 1;i <= m;++i) scanf( "%d",&a[i].first); for( inti = 1;i <= m;++i) scanf( "%d",&a[i].second); sort(a+ 1,a+m+ 1);
intnow = 0; for( inti = 1;i <= m;++i){ // 此时的位置时 a[i].first, // 上一个位置时 a[i].first-1// 上一个位置的前缀和就是 nowif(now < a[i].first -1){ puts( "-1"); return0; }now += a[i].second;if(now < a[i].first){ puts( "-1"); return0; }}if(now != n){ puts( "-1"); return0; }longlongans = 1ll*n*(n+ 1)/ 2; for( inti = 1;i <= m;++i) ans -= 1ll*a[i].first * a[i].second; printf( "%lld\n",ans); return0; }
D代码
usingnamespacestd; queue< longlong> q; longlongtag = 0;
intmain{ intQ; scanf( "%d",&Q); while(Q--){ intop; scanf( "%d",&op); if(op == 1){ // 加一个实际的0,在队列是-tagq.push(-tag);}if(op == 2){ // 整体加上 T,所以 tag += TintT; scanf( "%d",&T); tag += T;}if(op == 3){ // 看有多少个 >= HintH; scanf( "%d",&H); intans = 0; while(!q.empty && q.front+tag >= H){ q.pop;ans++;}printf( "%d\n",ans); }}return0; }
E代码
constintMAXN = 2e5+ 5; intn; charstr[MAXN]; longlonga[MAXN];
intmain{ scanf( "%d",&n); scanf( "%s",str+ 1);
for( inti = 1;i <= n;++i){ a[n-i] += i*(str[i]- '0'); }
for( inti = n -1;i >= 0;--i) a[i] += a[i+ 1];
for( inti = 0;i <= n -2;++i){ a[i+ 1] += a[i]/ 10; a[i] %= 10; }
intlen = n -1; while(a[len] >= 10){ a[len+ 1] = a[len]/ 10; a[len] %= 10; len++;}for( inti = len;i >= 0;--i) printf( "%lld",a[i]); return0; }
F代码
usingnamespacestd; constintMAXN = 2e5+ 5; intn,q; inta[MAXN]; intans[MAXN];
std:: vector<pair< int, int> > query[MAXN]; // query[i]: 所有左端点为i的询问, <右端点, 第几个询问>intstk[MAXN],tp;
intmain{ scanf( "%d%d",&n,&q); for( inti = 1;i <= n;++i) scanf( "%d",a+i); for( inti = 1;i <= q;++i){ intl,r; scanf( "%d%d",&l,&r); query[l].emplace_back(r,i);}
for( intl = n;l >= 1;--l){ // 先处理所有询问for( auto[r, idx] : query[l]){ if(tp == 0) ans[idx] = 0; elseans[idx] = lower_bound(stk+ 1,stk+tp+ 1,-r)-stk -1; }while(tp && a[-stk[tp]] < a[l]) tp--; stk[++tp] = -l;}
for( inti = 1;i <= q;++i) printf( "%d\n",ans[i]); return0; }
G代码
voidadd( int&x, inty) { x += y-mod;x += x>> 31&mod; }
intpw[MAXM]; // pw[i]=3^iintn,m; charstr[MAXN][MAXN]; // 输入的inta[MAXN][MAXM]; // 列 <= 14
std:: vector< int> all_state; std:: map< int, int> state_id; // S -> all_state 的位置std:: vector< int> next_state[MAXS]; // next_state[i]: 第i个状态(all_state[i]) 下一行能填啥
voiddfs( intS, intT, intstep) { if(step == m){ // 已经填好了next_state[state_id[S]].push_back(state_id[T]);return; }ints_i = (S / pw[step])% 3; intt_last = (step == 0) ? -1: (T / pw[step -1]) % 3; for( into = 0;o < 3;++o){ if(o == s_i || o == t_last) continue; dfs(S, T+o*pw[step], step+ 1); }}
intf[ 2][MAXS],now;
intmain{ pw[ 0] = 1; for( inti = 1;i < MAXM;++i) pw[i] = pw[i -1] * 3; scanf( "%d%d",&n,&m); for( inti = 1;i <= n;++i) scanf( "%s",str[i]+ 1);
boolflip = 0; if(n < m) flip = 1, swap(n, m);
for( inti = 1;i <= n;++i) for( intj = 1;j <= m;++j){ charo = flip ? str[j][i] : str[i][j]; a[i][j] = (o == '?') ? -1: (o- '1'); }
assert(m <= 14); // RE assertion failed.
// 搜索所有合法状态for( intS = 0;S < pw[m];++S){ intlas = -1; boolflag = 1; for( inti = 0;i < m;++i){ into = (S/pw[i])% 3; if(las == o) {flag = 0; break;} las = o;}if(flag){ state_id[S] = all_state.size;all_state.push_back(S);}}
now = 0; // 搜索所有合法转移for( inti = 0;i < all_state.size;++i){ intS = all_state[i]; dfs(S, 0, 0); // S 能否作为第一行boolflag = 1; for( intj = 0;j < m;++j){ if(a[ 1][j+ 1] != -1&& (S/pw[j])% 3!= a[ 1][j+ 1]){ flag = 0; break; }}if(flag) f[now][i] = 1; elsef[now][i] = 0; }
for( inti = 2;i <= n;++i){ memset(f[now^ 1], 0, sizeof(f[now^ 1])); for( intj = 0;j < all_state.size;++j){ intS = all_state[j]; // j 能否作为第 i 行boolflag = 1; for( intk = 0;k < m;++k){ if(a[i][k+ 1] != -1&& (S/pw[k])% 3!= a[i][k+ 1]){ flag = 0; break; }}if(!flag) continue; for( autok:next_state[j]){ add(f[now^ 1][j], f[now][k]); }}now ^= 1; }
intans = 0; for( inti = 0;i < all_state.size;++i) add(ans, f[now][i]); printf( "%d\n",ans); return0; }
题库地址:https://atcoder.jp
针对每周六20:00举办的ABC比赛,我们每周日都会对比赛直播。
AtCoder-OI初学者最佳题库推荐(附比赛参赛方式介绍) <<<点击查看
1
IOI2024 信息学国家队名单出炉,学军中学2人入选!
IOI2024中国队获得两金一银好成绩!
清华大学&北京大学2024年各省各批次录取分数线
祝贺!NOI创建40周年表彰名单公示
379人获奖!APIO 2024获奖名单公示
最适合信息学初学者题库推荐-AtCoder
2024年高校保送生拟录取名单发布,共1808人,清华北大共319人
GESP与CSP-J/S的衔接办法发布-GESP七级可直通CSP-J第二轮
NOI2024报名通知发布
2024五大学科竞赛国家队名单全部发布
260人入选获清北保送资格!2024年五大学科竞赛国家集训队名单出炉
信息学竞赛金牌教练-讲述优秀的学生是如何养成的
信息学高手是怎么炼成的 | 入选信息学国家队,被清北保送两次!
西交大少年班考试近日结束,一起来了解国内现有的几个少年班
姚班信息学大牛讲座视频-如何学好信息学竞赛(入门篇)
学好信竞-浅谈信息学竞赛考场策略及程序测试
详细盘点清华姚班 智班,北大 浙大图灵班等多所高校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.国务院发文支持编程教育进入中小学,中国人工智能厚积薄发
关注「信息学竞赛」
看更多信息学趣闻与知识
↓ ↓↓返回搜狐,查看更多
责任编辑: