
思维&构造&模拟
大量来自codeforces或者atcoder的构造或者模拟好题
_rhinoceros_
非淡泊无以明志,非宁静无以致远。
展开
-
AtCoder ABC001A積雪深差,ABC001B視程の通報 题解及翻译(模拟)
给定两个雪深 h1,h2, 以 int 形式给出,求 h1-h2;原创 2023-09-17 08:06:44 · 278 阅读 · 0 评论 -
Codeforces Global Round 14 D. Phoenix and Socks 题解
一、算法分析如何分析这样的题目?宏观来看,将两只袜子匹配的花费可能是0,1或2,经过分析,先把0花费匹配完之后,不会影响最终结果。那么我们的目标就是使花费2的尽可能地少。花费0的匹配为:同色不同左右的匹配。花费1的匹配为:①同色同左右的匹配;②异色不同左右的匹配。花费2的匹配为:同色同左右的匹配。在花费0的匹配结束后,每种颜色的袜子就只剩下左袜子或者右袜子。设第i种左袜子的个数为l[i],右袜子为r[i].在进行完花费0的操作之后:不妨设左袜子个数l_cnt>=r_cnt,则优先用l_原创 2021-10-22 05:19:48 · 223 阅读 · 0 评论 -
Codeforces Round #720 (Div. 2) D. Nastia Plays with a Tree 题解
一、算法分析基本算法是树上统计+贪心。笔者参赛时是不会做的,后来参考了洛谷too_late 的博客 的 https://www.luogu.com.cn/blog/115857/solution-cf1521d题解才码出这道题。下面简单地描述一下思路:1.划分链的种类,可以将链划分为1号链和2号链。2.对于每个子树,最好的情况是能保留成1个1号链,或1个二号链。所以对于一棵子树,设子树的根结点为u,u的子结点为集合{v},则对于所有的v,其可能是1号链的根结点(记为1号v)或2号链的根结点(记为2号v原创 2021-10-19 23:59:25 · 143 阅读 · 0 评论 -
Codeforces Round #720 (Div. 2) B.Nastia and a Good Array 题解(思维题)
一、算法分析基本题意是给定一个数列,然后每次可以找两个数,将这两个数交换位置,再将两个里面较大的那个换成任意一个大于等于这两个数中较小者的数。或者将两个数中较大的那个变得更大。最终目标是相邻两个数互质。要求这样的操作次数少等于n次。这道题的一个关键信息是操作次数不需要求最小值。构造方式:因为不一定求最优,所以可以每次只解决一位。题目中还有一个特殊条件,即x和y的范围比原数列的元素范围大所以可以先找到数列里面的最小的数,然后从头到尾将其它数都变成大于原序列的最小值的最大可能值的大质数,比如本题可以用1e9原创 2021-10-19 17:59:34 · 150 阅读 · 0 评论 -
Codeforces Round #719 (Div. 3) E. Arranging The Sheep 题解
一、算法分析将星号聚拢到中间的那个星号上,可以使得总路程最短。每个星号的路程花费是其距离中间星号之间的点号个数。最开始自己想到的方法是前缀和维护,但是TLE了。正解如下。二、代码及注释正解: 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 #define LL long long 6 using namespace std;原创 2021-10-19 03:41:59 · 172 阅读 · 0 评论 -
Codeforces Round #719 (Div. 3) D. Same Differences 题解
一、算法分析很经典的做法,把原来的aj−ai=j−ia_j-a_i=j-iaj−ai=j−i进行移项,变成aj−j=ai−ia_j-j=a_i-iaj−j=ai−i,从而生成一个新的数组bi=ai−ib_i=a_i-ibi=ai−i,对于新数组,只需要统计某个数bib_ibi之前有多少个和其相等的数即可。对于这种题目,要求就是要做得快,代码要一气呵成尽可能不要出错,要思考缜密。比如这道题的bbb数组元素下标就可能小于0,那么就要用到偏移量或者是用map数组。二、代码及注释 1 #inc原创 2021-10-19 03:36:53 · 247 阅读 · 0 评论 -
Codeforces Round #719 (Div. 3) C. Not Adjacent Matrix 题解(构造题)
一、写在前面按说这就是一道典型的构造题。但是由于参赛经验不足,自己又去多想能否用枚举,甚至dfs等做法来做,而忽略了数据范围的问题,导致最后没有完成这道题。二、算法分析参赛时就想到了按奇数和偶数构造。因为要求差1,那么我们按照先填奇数再填偶数的策略来做,这样可以保证奇数的部分左右相邻至少差1,偶数部分同理。考虑上下相邻,更是差2∗n。那么就只用考虑衔接处即可,这里有个巧妙的方式就是奇数和偶数都从小到大排列,这样衔接处差距最大。只有2这个特例无法构造,输出-1即可三、代码及注释 1 #include原创 2021-10-19 03:34:37 · 143 阅读 · 0 评论 -
Codeforces Round #720 (Div. 2) A. Nastia and Nearly Good Numbers 题解(思维题)
(之前写在小号里了,现在大号找回来了,所以再搬回来)一、算法分析首先想到将x+y=z写成Ai+Aj=ABk,这样可以约掉A.变成i+j=Bk,然后令i=1,j=B−1,k=B即可。接着构造数据考虑特殊情况,要求x和y不能是AB的倍数,则需要考虑对于以上的构造方式,什么情况下x和y是AB的倍数,结果只有B=1的情况下成立,则特判B=1的情况即可。同理,对于题目中要求x,y,z三个数不同的条件,特判B=2的情况即可。二、代码 1 #include<iostream> 2原创 2021-10-18 01:05:39 · 111 阅读 · 0 评论 -
Educational Codeforces Round 108 (Rated for Div. 2) C. Berland Regional(思维,枚举)
(之前写在小号里了,现在大号找回来了,所以再搬回来)一、算法分析基本思路就是枚举,还有利用vector的一些小技巧。注意的点是,最后的枚举方式要有一个小优化,不能外层对k进行枚举,如果那样会超时,因为两层循环都是n。而是应该开一个res数组,以组为单位去维护res数组。二、代码及注释 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring>原创 2021-10-17 10:56:24 · 125 阅读 · 0 评论 -
Educational Codeforces Round 108 (Rated for Div. 2) A. Red and Blue Beans(思维题)
(之前写在小号里了,现在大号找回来了,所以再搬回来)一、思想刚开始拿到这道题有点懵,但是很快确定了基本的解题方向:r,b,d三个参数,通过其中两个来确定另一个的合理范围,从而确定另一个是否合法。然后开始造了几个数据,以 2 7 3 为例,可以考虑把2拆成一个一个的,则每个最大可以配一个4(因为1 + 3 == 4),所以对于这个样例,b的最大取值可以是8,所以7是合理的。二、代码及注释 1 #include<iostream> 2 #include<cstring>原创 2021-10-17 10:49:58 · 133 阅读 · 0 评论 -
(模拟)CF7B Memory Manager
一、算法分析模拟类题目,思路都在代码和注释里了。读题难度不大,其中一个小坑是erase后面跟的是任意整数,也就是说可能是负数。个人觉得难点在于对于alloc操作的优化和deflagment操作的实现,其中deflagment自己想了很久才想到只要记录左边空位数量就能移了。二、代码及注释//内存块的编号为连续的正整数编号//一道纯模拟题#include<iostream>#include<cstring>#include<cstdio>#include<原创 2020-07-14 08:04:58 · 341 阅读 · 1 评论 -
(模拟)洛谷P4924 [1007]魔法少女小Scarlet
一、算法分析首先要想到的是,对于矩阵的旋转操作,可以从外到内分一层一层来做,这就把每次矩阵的旋转操作变成了r次边的旋转。此外,交换问题需要设置辅助数组。然后就是一个小trick,在for循环里面加一个t作为位置的辅助变量,可以方便每次的旋转。还有就是自己做这道题的时候,先写了顺时针,写顺时针就调了一段时间,结果想到还要写逆时针,很麻烦。于是突然想到,逆时针等于三次顺时针,于是直接复制前面写好的顺时针代码,完美解决问题。二、代码及注释#include<iostream>#include&l原创 2020-05-12 16:40:57 · 377 阅读 · 0 评论 -
模拟-(输入输出控制)UVa213信息解码 题解(参考紫书)
一、本题主要算法本题算法设计方面的一个核心技巧就是我们可以不必以字符串的形式来保存编码,而是可以直接将编码理解为二进制,然后用一个二元组(对应十进制的值和二进制数长度)来进行表示。本题的难度还体现在对输入输出的控制方面,因为题目里面讲到:Carriage returns may appear anywhere within the message part. They are not to b...原创 2019-11-25 01:35:04 · 167 阅读 · 0 评论 -
P1042乒乓球(洛谷试炼场解题报告-交叉模拟)
洛谷试炼场解题报告-P1042乒乓球难度:普及-题目链接(https://www.luogu.org/problemnew/show/P1042)代码:#include"iostream>#include"cstdio>#include"cstring>#include"algorithm>#include"sstream>#include"strin...原创 2019-06-17 15:42:32 · 409 阅读 · 0 评论 -
p1478陶陶摘苹果升级版(stl实现特简洁)
原题链接戳这里!!!这道题很经典,而且可以作为stl入门题来做,推荐刚开始学stl的同学尝试一下。其实我学stl的时候,就是把之前的很多题再拿来用stl改一下,慢慢就熟练了。代码及题解#include<cstring>#include<cstdio>#include<iostream>#include<algorithm>#inclu...原创 2019-06-17 16:16:19 · 283 阅读 · 0 评论 -
uva839天平题解
洛谷题目链接本题关键是这个&,在函数的参数名字前加上“&”符号,表明这个参数按照传引用(by reference)的方式进行传递,而不是c语言中默认的传值(by value)方式传递。这样,在函数内改变参数的值,也会修改到函数的实参。(见紫书第103页)。这样的话,当存在子天平的情况时,子天平的总重量就会在一次次函数调用中累加起来,而不是最开始时默认的0.这样,子天平就可以被当...原创 2019-07-03 18:02:05 · 267 阅读 · 0 评论 -
交叉模拟-洛谷P1086花生采摘题解
题目链接题目戳这里用到的思想模拟类题目基本上没有什么思想,该题解采用试错回溯的方法进行模拟,减少了代码量。值得注意的是,该题解编写了两个子函数,体现了自顶向下的编程思路;虽然是道简单题,但题解代码中的子函数采用了以指针为返回值的方式,优势是可读性较强,便于进行交互。此外,该题解在函数和变量的命名方式上也有些特点。在对死循环的写法上,也尽可能使之易于调试。代码#include<ios...原创 2019-11-12 20:27:22 · 284 阅读 · 0 评论 -
模拟-洛谷P1098 字符串的展开 题解
一、题目链接题目戳这里!二、注意点这道题想法不错,就是太坑,挖的坑多,给的样例又太简单,这就造成了本题得分率高,全对率极低,可以看到这道题提交48.65k次,AC对只有13.83k,说明基本上一个人交四次才能对。这个正确率远低于其它同考察点的题。这道题其实就考察范围就是选择结构,你甚至可以不用数组来做。但是本题解用到了数组。本文题解还是用自顶向下的编程思想,将填充字符单独写了一个函数,这...原创 2019-11-15 19:15:11 · 237 阅读 · 0 评论