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

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

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


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

红橙黄绿蓝紫黑

%
2019/10/5∼2021/3/12019 / 10 / 5 \sim 2021 / 3 / 12019/10/5∼2021/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⌋22^\frac{\lfloor n\rfloor}{2}22⌊n⌋​

[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,ji,ji,j ,并进行相应的增加删除操作(例如统计区间同一颜色数量,就修改 cnt 并根据需要修改 res ),时间复杂度是 O(nn)O(n\sqrt n)O(nn​) 一般可以过 104∼10510^4\sim 10^5104∼105 的数据。奇偶排序优化:如左端点L都在奇数块,则对R从大到小排序;若L在偶数块,则对R从小到大排序。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[CF485A 绿]:爆搜 + 约数循环节 显然可以直接爆搜枚举判断,因为在他的简化剩余系内一定会出现循环节, m≤105m\le 10^5m≤105 。爆搜只搜没有遍历过的点是 O(m)O(m)O(m) 的复杂度,找到就直接输出 YESYESYES 并 exit(0); 退出即可。

[CF476D 紫]:构造 首先要知道两个定理:1. 相邻的两个奇数一定互质 2. 相邻的两个自然数一定互质。 当 k=1k=1k=1 时,手推几组数据。如 1,2,3,5;7,8,9,11;13,14,15,17;19,20,21,23;25,26,27,291,2,3,5;\ 7,8,9,11;13,14,15,17; \ 19,20,21,23;\ 25,26,27,291,2,3,5; 7,8,9,11;13,14,15,17; 19,20,21,23; 25,26,27,29。就会发现是以 666 为周期,而对每一个周期内的数乘以 kkk 就会使周期内的数两两的最大公约数为 kkk。当 k≠1k\neq1k​=1 时,显然每个组成的四元组除以 kkk 之后一定互质。那么问题就转变成寻找 nnn 个互质的四元组。当 xxx 为奇数时,显然 x,x+1,x+2,x+4x,x+1,x+2,x+4x,x+1,x+2,x+4 互质,即三个相邻的数以及两个相邻的奇数。当 xxx 为偶数时,显然 x,x+1,x+3,x+5x,x+1,x+3,x+5x,x+1,x+3,x+5 互质。即最大数为 k * (n * 6 - 1) ,每组 xxx ,x = (i - 1) * 6 + 1

[CF453D 紫]:FWT + 快速幂优化 根据题目中 fff 函数的性质,需要用到位运算所以考虑 FWT , 我们发现 fff 函数的值域我们是可以直接预处理的,因为异或运算可以看作不进位的加法,即: u,v≤n→u⊕v≤nu,v\le n\to u\oplus v\le nu,v≤n→u⊕v≤n。预处理完之后,发现题目中要求的式子 eee 是一个从 e1=e0×be_1=e_0\times be1​=e0​×b 开始的递推式,每次都是乘上一个 bbb ,求 ete_tet​ 所以考虑快速幂 O(1)O(1)O(1) 计算: btb^tbt。et[u]=∑j=u⊕vet−1[v]×num[j]=∑u=v⊕jet−1[v]×num[j]=∑u=v⊕je0[v]×num[j]te_t[u] = \sum_{j=u\oplus v}e_{t - 1}[v]\times num[j]=\sum_{u=v\oplus j}e_{t - 1}[v]\times num[j]=\sum_{u=v\oplus j}e_{0}[v]\times num[j]^t et​[u]=j=u⊕v∑​et−1​[v]×num[j]=u=v⊕j∑​et−1​[v]×num[j]=u=v⊕j∑​e0​[v]×num[j]t利用性质 i⊕j=k,j⊕k=ii\oplus j=k,j\oplus k=ii⊕j=k,j⊕k=i 实现经典套路交换,将数组的下标转换为枚举的下标,即可使用 FWT 加速卷积。et[u]=∑j=u⊕vet−1[v]×num[j]=∑u=v⊕jet−1[v]×num[j]=∑u=v⊕je0[v]×num[j]te_t[u] = \sum_{j=u\oplus v}e_{t - 1}[v]\times num[j]=\sum_{u=v\oplus j}e_{t - 1}[v]\times num[j]=\sum_{u=v\oplus j}e_{0}[v]\times num[j]^t et​[u]=j=u⊕v∑​et−1​[v]×num[j]=u=v⊕j∑​et−1​[v]×num[j]=u=v⊕j∑​e0​[v]×num[j]t 最后由于给定的是任意模数,每次求 inv2inv2inv2 会很慢,所以可以使用 k 进制 FWT,也就是把模数 ppp 乘上 nnn ,扩大 nnn 倍,最后在 IDFT 的时候除以 nnn 即可,不用再乘上 inv2inv2inv2 了 。a≡b(modp)⇔ad≡bd(modpd)(d∣gcd⁡{a,b,m})a\equiv b\pmod p\Leftrightarrow \frac a d\equiv \frac b d\pmod {\frac p d}(d|\gcd\{a,b,m\})a≡b(modp)⇔da​≡db​(moddp​)(d∣gcd{a,b,m})
最后的最后因为数据较大会爆 long long,所以需要使用 O(1)O(1)O(1) 的快速乘(unsigned long long)优化快速幂,O(logn)O(logn)O(logn) 的快速乘会 T。

[CF448C 蓝]:贪心 + 分治 因为每次只能涂一个单位长度的油漆,所以考虑贪心,对于横着涂一次的情况,显然这次涂色肯定是把这一层涂满,并且在这次涂色区域的下方,必定都是横着涂的。但是不一定是横着涂就最优,所以需要比较一下。
所以,对于一串栅栏h1,h2,…,hnh_1,h_2,…,h_nh1​,h2​,…,hn​,如果要横着涂,就必定要从底向上涂min⁡(h1,h2,…,hn)min⁡{(h_1,h_2,…,h_n)}min⁡(h1​,h2​,…,hn​)次。这样以后, h1,h2,…,hnh_1,h_2,…,h_nh1​,h2​,…,hn​就会分成若干不连通的子局面。我们可以直接分治,直接递归爆搜,从前往后遍历,复杂度是 O(n2)O(n^2)O(n2) 的,即先试着横着涂,然后将整个连续的序列分成若干个连通块,对于该连通块继续往下搜,尝试横着涂。最后返回的时候跟直接竖着涂即区间的长度比较取最小值即可。因为 n≤5000n\le 5000n≤5000 可以轻松通过。如果数据再大一点,因为爆搜 O(n2)O(n^2)O(n2) 的瓶颈在于需要 O(n)O(n)O(n) 找最小值,所以我们可以在爆搜的时候开一个线段树维护一下区间的最小值,返回的是最小值的下标即可,可以优化到 O(nlogn)O(nlogn)O(nlogn)。 ( O(n2)O(n^2)O(n2) Code

[CF438E 黑]:生成函数 + 多项式求逆 显然: 998244353→NTT998244353\to NTT998244353→NTT(bushi)题目中要求的是权值和为 sss 方案数,即点集中选取若干个点组成一颗权值和为 sss 的树的方案数,经典生成函数。我们设序列 fif_ifi​ 表示权值和为 iii 的符合条件的二叉树的个数,gig_igi​​ 表示权值 iii 是否包含在 ccc 中,显然有 f0=1f_0=1f0​=1,根据题意可得:
fn=∑i=1ngi∑j=1n−ifjfn−i−j[n>0]f_n=\sum_{i=1}^ng_i\sum_{j=1}^{n-i}f_jf_{n-i-j}[n>0]fn​=i=1∑n​gi​j=1∑n−i​fj​fn−i−j​[n>0]

经典操作,输入的时候处理一下 gig_igi​ ,经典动规及乘法原理:权值和为 nnn 的方案数 === 权值和为 jjj 的方案数 ×\times× 权值和为 n−i−jn-i-jn−i−j 的方案数 ×gi(i是否存在)\times\ g_i\ (\text{i是否存在})× gi​ (i是否存在) 我们只需要令 FFF 表示序列 fff 的生成函数,GGG 表示序列 ggg 的生成函数。 则:F=G×F2+1F=G\times F^2+1F=G×F2+1。生成函数 GGG 已经预处理了,求出 FFF 即可。问题变成了一个一元二次方程,显然可以直接使用求根公式:F=1±1−4G2GF=\cfrac{1± \sqrt{1-4G}}{2G}F=2G1±1−4G​​。 因为 2G2G2G 可能为 000 不可求逆,所以需要化简移项: F=21±1−4GF=\cfrac{2}{1±\sqrt{1-4G}}F=1±1−4G​2​。因为 F0=1,G0=0F_0=1,G_0=0F0​=1,G0​=0,故取 +++ ,即:F=21+1−4GF=\cfrac{2}{1+\sqrt{1-4G}}F=1+1−4G​2​
,直接多项式开根 + 多项式求逆即可。(Code)

[CF429D 紫]:前缀和 + 平面最近点对 题意实际上就是给定长度为 nnn 的一串序列a1,a2,...,ana_1, a_2,...,a_na1​,a2​,...,an​,找到两个正整数i,j∈[1,n]i,j\in[1,n]i,j∈[1,n],求(i−j)2+(∑k=i+1jak)2(i-j)^2+(\sum_{k=i+1}^{j}a_k)^2(i−j)2+(∑k=i+1j​ak​)2 的最小值。显然可以将原式中的∑k=i+1jak\sum_{k=i+1}^{j}a_k∑k=i+1j​ak​ 用前缀和 Sj−SiS_j-S_iSj​−Si​ 替代,则原式变换为 (i−j)2+(Sj−Si)2(i-j)^2+(S_j-S_i)^2(i−j)2+(Sj​−Si​)2 显然可以看出来这个式子就是求两点之间欧几里德距离的平方,于是原题转化为求平面上的最近点对距离的平方。我们可以直接预处理 SSS 数组,然后分治求平面上最近点对即可。(Code)

[CF294C 紫]:组合计数,多重集的排列数 很明显,对于一段两端有两个已经点亮的灯的这段区间来说,只能从两端开始往内部一步一步延伸,每次可以选择从左向右点灯,也可以选择从右往左点灯,也就是有两种选择,最后点亮的那一个灯,显然只剩它一个,只有一种选择,即方案数为 2len−12^{\ len-1}2 len−1。对于一段,一端有已点亮的灯,一段是所有灯的左右端点,显然只能从已点亮的那仅有的一个灯开始向端点拓展,仅有一种点亮方案。然后问题就变成了从一排灯中选择已点亮的灯旁边的灯开始点灯。然后题目只给你一共有 nnn 盏灯,其中 mmm 盏灯是亮着的,以及哪些灯是亮着的,相当于这 mmm 盏已经点亮的灯把剩下的 n−mn-mn−m 盏没有亮的灯隔开成了若干块(因为对于所有的区间块,我们可以每次选择任意一个区间进行点灯,即点灯的时候可以交叉点灯)所以我们先选块的方案数,然后用乘法原理将块内和块外的方案数乘起来就是答案。那么问题就相当于是在总长度为 n−mn-mn−m 元素序列,被 mmm 个点分为了 xxx 个区间,第 iii 个区间内有 aia_iai​ 个元素。我们发现这实际上就是一个多重集的排列数问题,相当于是一个多重集 S={a1,a2,⋯,ax},(N=∑i=0xai=n−m)S=\{a_1,a_2,\cdots,a_x\},(N=\sum_{i=0}^{x}a_i=n-m)S={a1​,a2​,⋯,ax​},(N=∑i=0x​ai​=n−m),显然总方案数为 N!a1!a2!⋯ax!\cfrac{N!}{a_1!a_2!\cdots a_x!}a1​!a2​!⋯ax​!N!​ 。算出这个值以后再乘上最开始分析的每个块内点灯的方案数 2len−12^{\ len-1}2 len−1 即可。(实现的候注意输入的已点亮的灯的编号不一定是单调的,所以先排序,这是个好习惯,数学题开全局 long long也是个好习惯 )

[CF282A 红]:直接模拟 ifelse …

[CF280A 绿]:简单计算几何 直接做高用各种三角函数,列方程解方程即可。显然那几个小三角形是全等的,直接算就行了

[CF266B 橙]:直接模拟 数据贼小,直接每一秒,遇见 B+GB+GB+G 就把他们交换即可。

[CF263A 红]:直接模拟 直接计算曼哈顿距离计算即可。

[CF231C 蓝]:滑动窗口 / 双指针

  • 滑动窗口版双指针是 rrr 往前冲,双指针算法是 lll 往前冲。

  • 滑动窗口版双指针一般初始的时候 l=rl=rl=r,双指针算法一般 lll 和 rrr 别开,即初始的时候 l=1,r=0l=1,r=0l=1,r=0 或者 l=0,r=−1l=0,r=-1l=0,r=−1 ,并且回溯的时候保持这个状态。

这里显然直接滑动窗口,用双指针实现。假设右指针 rrr 指向的 a[r] 是最终的答案,由于我们只有 +1 操作,所以我们只能修改所有小于 a[r] 的数,所以我们要先排序,这样双指针维护一个滑动窗口,若当前需要修改的次数大与 kkk,就 pop掉窗口左指针指向的点(sum -= a[l ++ ]),显然将窗口内所有的数都修改成 a[r] 需要修改的次数就是 a[r]×len−suma[r]\times len - suma[r]×len−sum。(Code)

[CF190C 蓝]:递归模拟 显然每一个 pair 一定要先跟上一个 <,然后递归找左区间,然后加上 , ,然后递归找右区间,然后加上 > 然后回溯。每遇到一个 int 答案就直接连上 int 。如果最后递归结束后还有剩余的则不合法。

void solve() {string s; cin >> s;if(s == "pair") ans += "pair<", solve(), ans += ",", solve(), ans += ">";else if(s == "int") ans += "int";else flag = 0;
}
int main() {ans = ""; string s; flag = 1; cin >> n; solve(); cin >> s;if(flag == 0) puts("Error occurred");else if(s.size() != 0) puts("Error occurred");else cout << ans << endl;return 0;
}

[CF189A 黄]:必须装满的完全背包 注意初始化 f[0] = 0 ,因为长度为 000 的带子只能剪成 000 段。
[CF156D 紫]: Prufer 序列 结论:ans=nk−2×∏i=1ksi\displaystyle ans=n^{k-2}\times \prod_{i=1}^ks_ians=nk−2×i=1∏k​si​。其中 sis_isi​ 为第 iii 个连通块的点数。我们直接用并查集计算一下连通块的点的数量即可。(Prove and Code)

[CF136A 红]:题目过水被隐藏了

[CF117C 蓝]:竞赛图 竞赛图,即有向完全图,任意两个点之间必有一条边。竞赛图的一些性质:竞赛图没有自环,没有二元环;若竞赛图存在环,则一定存在三元环。(即若存在一个大于三元的大环,那么一定存在另一个三元的小环。)我们可以直接DFS。

[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]

[CF1288C 绿]:根据题意显然所有的 bbb 数组都大于 aaa 数组,也就意味着我们可以将 a,ba,ba,b 数组连起来形成一个 b[1],b[2],…,b[m],a[m],a[m−1],…,a[1]b[1],b[2],…,b[m],a[m],a[m-1],…,a[1]b[1],b[2],…,b[m],a[m],a[m−1],…,a[1] 的数组,长度为 2m2m2m ,非严格单调递减的数组,取值 ∈[1,n]\in[1,n]∈[1,n]。问题就可以转换为有 nnn 个盒子排成一排,由他们的顺序决定所取的数字(即 nnn 个不同的盒子),然后将 2m2m2m 个相同的小球放进去,允许空盒子存在(任意的放置方案均合法,因为题目中非严格单调,可以相等,所以无论怎么放,我们都可以将这些小球放的盒子标号从大到小排序,再分配,一定满足满足条件),使用隔板法显然方案数为 C2m+n−1n−1C_{2m+n-1}^{n-1}C2m+n−1n−1​

[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的最后一题,补都不想补

洛谷千题复习计划(一)(Codeforces + AtCoder)相关推荐

  1. 洛谷千题详解 | P1008 [NOIP1998 普及组] 三连击【C++、Java、Python语言】

    博主主页:Yu·仙笙 专栏地址:洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析: C++源码: Java源码: Python源码: ----------------------- ...

  2. 洛谷千题详解 | P1014 [NOIP1999 普及组] Cantor 表【C++、Java语言】

    博主主页:Yu·仙笙 专栏地址:洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析: C++源码: C++源码2: C++源码3: Java源码: ----------------- ...

  3. 洛谷千题详解 | P1010 [NOIP1998 普及组] 幂次方【C++、Java、Python、Pascal语言】

    博主主页:Yu·仙笙 专栏地址:洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析: C++源码: Pascal源码: Java源码: Python源码: ------------- ...

  4. 2021寒假——洛谷刷题计划(35题)

    (希望大家不要Copy) AC:Accept,程序通过. CE:Compile Error,编译错误. PC:Partially Correct,部分正确. WA:Wrong Answer,答案错误. ...

  5. 洛谷刷题:明明的随机数、质因数分解、不高兴的津津、津津对的储存计划和车厢重组

    记录洛谷刷题过程QAQ 一. [NOIP2006 普及组] 明明的随机数 题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N N N 个 1 1 1 到 1 ...

  6. 洛谷日常刷题(洛谷官方题单 思路+详解)

    目录 前言 非官方题单的题 P1141 01迷宫 1-4 递推与递归 P1255 数楼梯 1002 [ NOIP 2002 普及组]过河卒 P1044 [NOIP2003 普及组] 栈 P1028 [ ...

  7. 洛谷刷题部分代码(C语言)

    洛谷刷题部分代码存档 我刚刚发现做过的题再找源代码有一点麻烦,遂决定以博客的形式保存.以方便引用.更新. P1055 [NOIP2008 普及组] ISBN 号码 #include<stdio. ...

  8. 深入理解 操作系统 LRU算法(以洛谷P1540题为例)

    LRU算法 LeastRecentlyUsedLeast Recently UsedLeastRecentlyUsed 算法,意为"最近最少使用",这是操作系统内存管理部分重要的一 ...

  9. 深入理解 操作系统 SJF算法(以洛谷P1223题为例)

    CPU Scheduling Algorithms 重要的CPU调度算法如下: FCFS Scheduling(First-Come, First-Served) SJF Scheduling(Sho ...

最新文章

  1. nginx防止跨站 lnmp多站点安全设置之一
  2. win10安装net3.5不成功出现 0x8024402c_在移动硬盘中安装win10和macos双系统
  3. 忽略异常_忽略已检查的异常,所有出色的开发人员都在这样做–基于600,000个Java项目...
  4. 科学的分析猪八戒到底是什么猪,黑猪还是白猪?
  5. 边开车边唱K?特斯拉汽车卡拉OK功能即将推出
  6. 奇异值与主成分分析(PCA)
  7. EGit(Git Eclipse Plugin)使用
  8. 《Effective Java 3rd》读书笔记——类和接口
  9. [POJ1830] 开关问题
  10. 遍历点击事件(屏蔽同类名的其它点击事件,防止多次请求)
  11. 计算机组成原理袁春风百度云,计算机组成原理[袁春风]chap32.pdf
  12. ueedit富文本编辑器的使用
  13. 《看清你的思维图谱》读书笔记
  14. 重磅发布 | 图像图形学发展年度报告【中国图象图形学报第6期综述专刊】
  15. mysql lpad_MySQL LPAD字符串填充函数使用简介说明
  16. 医学影像常用Python包
  17. 2022年茶艺师(中级)考试题模拟考试题库及模拟考试
  18. linux docker启动指定字符集,【字符集】解决docker 容器中中文乱码问题
  19. 记一次查询超时的解决方案The timeout period elapsed......
  20. Mysql 增加表注释

热门文章

  1. 酒吧常放经典乐曲90首 CLUB MIX
  2. 科学计算机和普通计算器,[财经]普通计算器和科学计算器的区别是什么?手机计算器阵亡是怎么回事? - 南方财富网...
  3. 五部超燃科幻电影,九成没有全部看过
  4. Win8系统封装、恢复、OEM激活方法
  5. dw怎么用css做图片轮播(收藏)
  6. 用爬虫写一个,小说下载程序
  7. Vue中 前端实现生成 PDF 并下载
  8. 【angular】浏览器低版本报错,Object.assign
  9. 西班牙的计算机水平如何,西班牙人的真实英语水平是欧洲国家中最差的吗?
  10. luogu 1047