洛谷千题复习计划(一)(Codeforces + AtCoder)

本文作者分享了个人在洛谷(Codeforces + AtCoder)平台上的刷题复习计划,主要涉及算法模板整合,包括ACM模板、搜索、模拟、动态规划等多个方面。通过每天一小时的复习,作者对已完成的769道题目进行了梳理,分为不同的难度级别,如黄、橙、蓝、紫等,并提供了部分题目解析,涉及到的算法包括莫队算法、前缀和、动态规划、贪心、模拟等。此外,还提到了一些典型题目及其解决方案,如矩阵翻转、优先队列、约数循环节等。
摘要由CSDN通过智能技术生成

整理的算法模板合集: ACM模板

点我看算法全家桶系列!!!

实际上是一个全新的精炼模板整合计划


每天花一个小时简单复习一下我写过的洛谷的题目!
虽然还没有到千题,但是快了(等我复习完这些以后我 luogu 刷的题目就够千题了hhh
尽管因为太菜了写的都是水题呜呜呜

在这里插入图片描述

绿

%
2019 / 10 / 5 ∼ 2021 / 3 / 1 2019 / 10 / 5 \sim 2021 / 3 / 1 2019/10/52021/3/1 从大一自学C语言的小菜鸡到大二啥都不会的大菜鸡,洛谷750 +(含CF 200,UVA 100 ),AcWing 300 +,牛客150 + ,HDU 100 +,POJ 50 + ,CF,AT只算在线比赛大概也有个几十道,LoJ,BZOJ,51nod 零零碎碎几十题,vjudge不到不到一百题,搞竞赛一年半,也就写1500道题,其中大多数还都是水题 … 算法也没学多少,博客倒是水了600篇,我也太菜了吧(不行,越说越难受,已经开始自闭了

%
luogu 做题情况:
RemoteJudge)CF + AT:188(有好多比赛的时候写的题没去洛谷上交)
RemoteJudge)UVA + SPOJ:97
洛谷本站题目(P):484
共769道水题。
每一百题分为一篇,每天两小时,一小时写10道,预计一个月内复习完毕

妈呀,我写过的题怎么都这么水

[AT2271 黄]:思维,组合计数 若有奇数个人,一定有一个人左右差值为 0 否则不合法,从中间往两边拓展,一定均存在两个人的差值为 2,4,6,8… 偶数则没有为 0 的,往两边拓展一定为2,4,6,8,每个位置有两种选择,方案数为: 2 ⌊ n ⌋ 2 2^\frac{\lfloor n\rfloor}{2} 22n

[AT1350 黄]:搜索 深搜模板题

[AT1058 橙]:模拟 取模模拟循环 n=(n-1)%s.length();

[AT1219 紫]:回滚莫队模板 莫队简单来说就是离线查询一些区间的问题,我们可以将所有询问的区间 [ l , r ] [l,r] [l,r] 存下来,第一关键字按左端点的分块的编号排序,第二关键字右端点从小到大排序

bool cmp(const Query& x, const Query& y){
   
    int a = get_block(x.l);
    int b = get_block(y.l);
    if(a != b)return a < b;
    return x.r < y.r;
}

然后根据询问的内容进行修改,每次相当于是一个双指针,拓展到下一个询问区间扩大或者缩小双指针 i , j i,j i,j ,并进行相应的增加删除操作(例如统计区间同一颜色数量,就修改 cnt 并根据需要修改 res ),时间复杂度是 O ( n n ) O(n\sqrt n) O(nn ) 一般可以过 1 0 4 ∼ 1 0 5 10^4\sim 10^5 104105 的数据。奇偶排序优化:如左端点L都在奇数块,则对R从大到小排序;若L在偶数块,则对R从小到大排序。

回滚莫队是指需要实现的操作,区间伸长的时候很好维护信息,区间缩短的时候不太好维护信息(如最大值,删除以后不知道次大值是多少),我们可以使用回滚莫队,伸长正常维护,缩短的时候直接回滚到之前备份的地方。

大体上就是还按照普通莫队的排序方法排序,这样就可以保证每段内部的询问,左端点都在同一块内,右端点递增。像普通莫队那样正常询问,只不过在伸长的时候备份一下,也就是将 r r r 移动到当前询问的右端点,保存下来此时的信息。将 l l l 移动到询问的左端点,得到求出答案。然后直接用刚才保存的信息(备份)恢复现场。这样我们只有伸长的操作,避免了难以维护的缩短的操作。

[AT2412 橙]:前缀和 最后维护长度为 k k k 的答案即可。

[CF869B 橙]:思维 题目要求的是 b ! a ! \cfrac{b!}{a!} a!b! 的个位是谁,显然没办法暴力,我们知道一旦这里面有 10 10 10 ,那么个位数一定是 0 0 0 。所以如果 b − a > = 5 b-a>=5 ba>=5 ,则 b ! a ! = ( b − a ) ! \cfrac{b!}{a!}=(b-a)! a!b!=(ba)! 中一定存在 2 2 2 5 5 5 2 × 5 = 10 2\times 5=10 2×5=10 ,个位数为 0 0 0,否则暴力枚举计算即可。

[CF825E 蓝]:拓扑排序,贪心 一个有向图,要求输出字典序最小的 1 ∼ n 1\sim n 1n 的排列,也就是这 n n n 个点编号的排列,使得父结点的编号大于子节点,显然就是求一个拓扑序,但是不是普通的优先队列拓扑排序,因为这里不是给定所有的点的编号求顺序,而是让我们帮他编号,那么就直接贪心,我们建反边,这样拓扑排序的时候先出来的是子节点,我们给子节点贪心地赋当前剩余的最大值即可。

[CF805B 橙]:构造 构造长度为n的以’a’,'b’构成的字符串,使得其中不存在长为3的回文子串,显然构造成 a a b b a a b b a a b b a a b b ⋯ aabbaabbaabbaabb\cdots aabbaabbaabbaabb 即可。

[CF786B 紫]:线段树优化建边,最短路 其实抛去建图就是一个最短路的模板,只是连边的方式不同,这里的连边是可以每次连接两个点(全部都是有向边),或者将一个点与一个连续区间的点相连,或者将一个连续区间的点与这一个点相连,暴力 O ( n 2 ) O(n^2) O(n2) 数据 n ≤ 1 0 5 n\le 10^5 n105 不可过,其实仔细想想,他的提示性很强,连续区间,这不就是线段树嘛。我们可以直接建一颗父结点连一个有向边到子节点的线段树,一个点与一个连续区间连边,我们直接将这个点与该区间的父结点连边即可。至于区间向某一个点连边,我们再建一个棵线段树在树上反向建边就可以了。记得建线段树的时候线段树的编号不要重复即可。(Code)

[CF776B 黄]:质数 2 ∼ n − 1 2\sim n-1 2n1 ,A是B的素因子,则A与B的颜色不同,问染色方案,用最少的颜色。输出需要用的颜色方案数以及染色方案。显然所有素数互素,可以是一种颜色。所有合数, 2 ∼ n − 1 2\sim n-1 2n1 中一定含有素因子,是另一种颜色即可。注意特判一下序列里没有合数的情况,显然只用到了 1 种颜色。

[CF743C 黄]:小学数学经典转换 给定 n n n ,求 x , y , z x,y,z x,y,z 满足: 1 x + 1 y + 1 z = 2 n \cfrac {1}{x} + \cfrac{1}{y} + \cfrac {1}{z} = \cfrac {2}{n} x1+y1+z1=n2。显然 1 x + 1 y + 1 z = 1 n + 1 n \cfrac {1}{x} + \cfrac{1}{y} + \cfrac {1}{z} = \cfrac {1}{n}+\cfrac {1}{n} x1+y1+z1=n1+n1,若 1 x = 1 n \cfrac {1}{x} = \cfrac {1}{n} x1=n1,则 1 y + 1 z = 1 n \cfrac{1}{y} + \cfrac {1}{z} = \cfrac {1}{n} y1+z1=n1,显然 1 n − 1 n + 1 = 1 n ( n + 1 ) \cfrac{1}{n}-\cfrac{1}{n+1}=\cfrac{1}{n(n+1)} n1n+11=n(n+1)1,即: 1 n = 1 n + 1 + 1 n ( n + 1 ) \cfrac{1}{n}=\cfrac{1}{n+1}+\cfrac{1}{n(n+1)} n1=n+11+n(n+1)1 1 y = 1 n + 1 \cfrac{1}{y}=\cfrac{1}{n+1}

### 回答1: 我可以分享一种有效的训练计划,以达到codeforces橙名。首先,建立一个长期的训练计划,每周至少完成3-4个题目,把每个题目的解题过程都认真的思考一遍,确保理解每一步的思路。建议每隔一段时间,做一次综合练习,以更好地检验自己的知识水平。此外,参加竞赛也可以加深对算法的理解,从而提升解题能力。 ### 回答2: 想要在Codeforces达到橙名的水平,需要进行系统性的训练,并掌握一定的算法和编程技巧。以下是一个可能的训练计划: 1. 学习基础知识:首先,建议你系统地学习计算机科学的基础知识,包括数据结构和算法。这可以帮助你理解不同问题的解决方案,并优化代码的执行效率。 2. 解决题目:开始刷题是锻炼算法和编码能力的关键。选择一些简单的题目,如Codeforces的Div2 A、B级题目,按难度逐渐增加。通过不断解决题目,你将熟悉各种算法,并提高编写清晰、高效代码的能力。 3. 学习算法:学习和掌握一些常用算法,如贪心、动态规划、图论等。理解算法原理,分析其时间和空间复杂度,并通过练习将其应用于具体的问题。 4. 参加比赛:参加Codeforces的比赛是衡量自己水平的好方法。开始参加Div2级别的比赛,并争取在中等难度的题目上取得好成绩。逐渐挑战3级、4级比赛,尽量与更强的选手竞争,以提高自己的水平。 5. 反思和学习:每次比赛后,对自己的解题过程进行反思和总结。分析解错的原因,学习其他参赛选手的思考方式和技巧。通过学习他人的优秀代码和解题思路,不断提升自己的编码能力。 6. 练习编码技巧:除了算法,熟练掌握编码技巧也非常重要。学习并应用一些常用的数据结构和STL库,如数组、链表、栈、队列等。多写一些小项目或练习题,锻炼自己的编码能力。 7. 时间管理:合理安排学习和练习的时间。每天保持一定时间的刷题和学习,坚持养成好的学习习惯。同时,在比赛中也要控制好时间,并尽量在限定时间内完成题目。 总之,达到Codeforces橙名的水平需要长期的训练和不断的学习。通过刷题、学习算法和编码技巧、参加比赛以及反思总结,你可以逐渐提升自己的水平,并取得理想的成绩。记住,坚持和持续学习是达到目标的关键。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁凡さん

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值