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

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

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

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


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

没有按难度写题的习惯,结果到现在黑题只写了7道呜呜呜
在这里插入图片描述
绿

%
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} y1=n+11 1 z = 1 n ( n + 1 ) \cfrac{1}{z}=\cfrac{1}{n(n+1)} z1=n(n+1)1 ,输出即可。

[CF915A 红]:模拟 暴力枚举取最大值,或者用优先队列。

[CF853A 蓝]:简单优先队列贪心 设第 i i i 架飞机的时间安排为 d i \displaystyle d_i di​, 则总花费为 ∑ i = 1 n ( d i − t i ) ⋅ c i \displaystyle \sum_{i=1}^n{(d_i-t_i)\cdot{c_i}} i=1n(diti)ci ∑ i = 1 n d i ⋅ c i − ∑ i = 1 n t i ⋅ c i \displaystyle \sum_{i=1}^n{d_i\cdot{c_i}} - \sum_{i=1}^n{t_i\cdot c_i} i=1ndicii=1ntici
t i ⋅ c i t_i\cdot c_i tici ​不变,故 d i d_i di ​需要尽量的小,因为同样是等,同样都要花钱,费用大的多等就会多花钱,不如让他先走,花费小的再等一会,使得总花费最小。于是我们可以 c i c_i ci排序,尽量向小的取,显然使用优先队列。并且根据题目的限制,我们每次只能把起飞时间小于等于 i i i 的放入优先队列里,因为起飞时间也就是编号,所以从合法起飞时间的起点 k + 1 k+1 k+1 开始循环,然后搞一个指针 cnt , 所有 cnt <= i 的再放到队列里。并且每次起飞一架飞机,并算一下花费即可。(Code

[CF777A 橙]:模拟 显然就是找循环节的题目,发现循环节是 6 6 6 ,打表方案输出即可。

[CF701C 黄]:双指针 显然直接双指针,开一个桶记录一下一共有多少种颜色,然后双指针跑一遍,包含了所有颜色就更新答案。(有莫队模板题那味了hhh)

[CF662C 黑]:矩阵翻转 + FWT 这题其实挺离谱,本来应该是一个DP,然后发现 n ≤ 20 , m ≤ 1 0 5 n\le 20,m\le10^5 n20,m105,正常人肯定能立马想试试能不能状态压缩,然后发现我们不仅可以状压行翻转状态,对于每一个列的01状态因为只有 n n n 行,所以也可以状压,并且我们要求的答案可以 O ( 1 ) O(1) O(1) 贪心直接得到,矩阵翻转其实就可以写成异或的形式,列出来一个答案的式子,发现跟 FWT 有点像,经典转换之后就变成了 FWT 的模板了,太棒了,直接卷就行了hhh(Code

[CF660C 蓝]:双指针 显然我们直接双指针,输入的时候前缀和统计一下区间里 1 1 1 0 0 0 的个数,如果 0 0 0 的个数小于等于 k k k 就用区间长度更新答案,如果大于了就移动指针,最后取最值输出即可。(Code

[CF632A 红]:模拟 经典老奶奶卖苹果,直接倒推就行了。每次求和,如果没有送的话就直接乘2,送了的话就乘2+1,因为苹果一定是整数个嘛,最后有一半是自己卖出去的,一半是多加的,输出 sum * p / 2 即可。

[CF510D 紫]:裴蜀定理+最短路 因为每买一张牌,就可以获得 l [ i ] l[i] l[i] 跳跃能力,我们想要能够跳到所有的位置,显然可以想到 裴蜀定理 ,并且本题想要求最小的花费,也就是说题目变成了找到两个或者多个最便宜且他们的 l [ i ] l[i] l[i] 是互质的数,显然是一个动规问题,但是因为数据较大,动规比较难写,我们发现其实可以转换为一个图论问题,因为选择若干个数,实际上可以看作是从某一点出发,选择了哪些点就是走过了哪些点,即从 0 0 0 开始 x = 0 x=0 x=0,for 循环选择了 l [ i ] l[i] l[i],即从点 x x x 出发,而点 x x x 能到的点是 y = gcd ⁡ ( x , l [ i ] ) y=\gcd(x, l[i]) y=gcd(x,l[i]),中间最短路求的是能到达的点 y y y 的最小花费 d i s t [ y ] dist[y] dist[y],最后的答案即走到点 1 1 1(实际意义是所走的所有点的 gcd ⁡ = 1 \gcd=1 gcd=1 )最小花费即 d i s t [ 1 ] dist[1] dist[1] 。(Code

[CF498C 紫]:首先显然我们选择的两个数 ( i , j ) (i,j) (i,j) 操作之后, a [ i ] a[i] a[i] a [ j ] a[j] a[j] 均除以他们的公约数而不是最大公约数,也就是说如果一次操作中我们选择的 v v v 不是质数,那显然把它拆成若干次 v v v 是质数的操作更优(因为任何一个合数都可以拆成若干个质数的次方的乘积,唯一分解定理,这样拆成质数最后操作的次数会更多),那么问题就变成了:每次选取满足要求的一对数,同除一个质数,问能操作多少次。我们发现题目中还有一个重要的条件: i k + j k i_k+j_k ik+jk奇数,那么 i k i_k ik j k j_k jk 一定有一个是奇数,另一个是偶数,因此我们可以把数列中的元素按下标的奇偶分成两个集合。感觉有点像二分图了。最多的操作看上去好像是一个二分图匹配。注意到 v v v为不同质数时的操作是不会相互影响的,因此我们将数列中的元素质因数分解,时间复杂度为 O ( n a i ) O(n\sqrt{a_i}) O(nai ) ,我们发现,进行一次操作实际上就等价于,找到了一条关于质因子的匹配边,那么问题就变成了二分图最大匹配。也就是将输入的点都质因数分解,这样一个点拆成多个点,然后建图跑一次最大流即可,实际意义就是每次选取两个相同的质因子跑一次匹配,也就是操作一次,最多的操作次数就是最大匹配边数。(Code

[CF485A]
[CF476D]
[CF453D]
[CF448C]
[CF438E]
[CF429D]
[CF294C]
[CF282A]
[CF280A]
[CF266B]
[CF263A]
[CF231C]
[CF190C]
[CF189A]
[CF156D]
[CF136A]
[CF117C]
[CF71A]
[CF62A]
[CF56A]
[CF43A]
[CF38C]
[CF38A]
[CF37A]
[CF35A]
[CF34A]
[CF33A]
[CF32B]
[CF32A]
[CF29A]
[CF27A]
[CF26A]
[CF25B]
[CF25A]
[CF22A]
[CF20C]
[CF20A]
[CF16A]
[CF14A]
[CF12E]
[CF12A]
[CF11B]
[CF11A]
[CF10B]
[CF10A]
[CF9A]
[CF7C]
[CF6C]
[CF6B]
[CF6A]
[CF5C]
[CF5A]
[CF4C]
[CF4B]
[CF4A]
[CF3C]
[CF3B]
[CF3A]
[CF2A]
[CF1B]
[CF1A]
[CF978D]
[CF978C]
[CF993C]
[CF1015D]
[CF1015C]
[CF1015B]
[CF1066D]
[CF1066B]
[CF1070E]
[CF1108F][
CF1108D][
CF1108B]
[CF1108A]
[CF1144F]
[CF1144E]
[CF1144D]
[CF1144B]
[CF1144A]
[CF1177A]
[CF1182A]
[CF1108E1]
[CF1203E]
[CF1245D]
[CF1280A]
[CF1293B]
[CF1295C]
[CF1295B]
[CF1295A]
[CF1296B]
[CF1296A]
[CF1307D]
[CF1307C]
[CF1307B]
[CF1307A]
[CF1355E]
[CF1355D]
[CF1355C]
[CF1355B]
[CF1355A]
[CF1358A]
[CF1385E]
[CF1385B]
[CF1385A]
[CF1382A]
[CF1384A]
[CF1399E1]
[CF1399D]
[CF1399C]
[CF1399B]
[CF1399A]
[CF1393A]
[CF1391A]
[CF1398D]
[CF1398C]
[CF1398B]
[CF1398A]
[CF1401F]
[CF1401C]
[CF1401B]
[CF1401A]
[CF1400A]
[CF1397B]
[CF1397A]
[CF1409E]
[CF1409D]
CF1409C]
[CF1409B]
[CF1409A]
[CF1407D]
[CF1408D]
[CF1413C]
[CF1437D]
[CF1471B]
[CF1471A]
[CF1470D]
[CF1470C]
[CF1470B]
[CF1470A]
[CF1474C]
[CF1474B]
[CF1478C]
[CF1478B]
[CF1478A]
[CF1477C]
[CF1477B]
[CF1477A]
[CF1485F]
[CF1485D]
[CF1485C]
[CF1485B]
[CF1485A]
[CF1481F]
[CF1481E]
[CF1481B]
[CF1481A]
[CF1480B]
[CF1480A]
[CF1479B2]
[CF1479B1]
[CF1479A]
[CF1492D]
[CF1492C]
[CF1492B]
[CF1492A]

我好菜,就没怎么写过Div1的最后一题,补都不想补

猜你喜欢

转载自blog.csdn.net/weixin_45697774/article/details/114377118
今日推荐