- 博客(65)
- 收藏
- 关注
原创 2024年睿抗机器人开发者大赛(RAICOM)国赛题解
典型的分层图,一个城市有多个状态,跑一遍djikstra即可,注意本题是计算途经城市的hot值,所以初始状态是 d[s][0] = 0,在可以抵达t的时候来判断即可。贪心模拟,每次都暴力的找到可以选取的最大矩阵即可,然后模拟下降,没有找到正解,这里贴一下别人的x*(n^4)比较暴力的做法,赛时通过了。简单模拟题,对于多行读入使用while(getline(cin,s))即可。按照题目直接暴力枚举所有情况使用全排列 + 二进制枚举。简单模拟,按照题目意思模拟即可。
2024-08-06 16:02:40
601
原创 2024年睿抗机器人开发者大赛(RAICOM)省赛题解
题目告诉我们有一个位置的火炉被挡住了,那么最多也就是有几个小家伙是本来应该是很暖和但是现在却不是很暖和的,我们可以把不暖和小家伙的的九宫格位置设为可能有小火炉的然后检查,如果说可能的位置非常多肯定是不行,或者没有小火炉符合要求,注意C不能被小火炉影响。注意题目规定的章鱼子图的定义,可以得知要所在联通图的环只有一个的时候符合要求,否则就不是,我们可以通过并查集的方式维护每一个联通块中环的数量,然后可以同时维护一个环时候的起点和终点可以考虑使用bfs维护环的长度。
2024-07-15 21:58:26
1737
20
原创 AtCoder Beginner Contest 362
注意到很小的数据范围,要求我们求等差数列,等差数列的性质由首项,公差和项数决定,可以得知本题需要使用dp,考虑到要维护项所以需要开一个维度维护,同时我们不知道公差,可以开一个维度离散化维护公差,由题目数据范围可以得到只有n*n个公差,转移来源与上一个点所在的位置和公差。首先队友是不是有解我们可以通过答案是不是处于上界和下界即可,其次我们可以先贴着下界,然后往上尽可能加不超过上界的值即可。我们要求最大的的距离匹配,可以想到重心的性质然后对于不同的树进行匹配一定是最优的。
2024-07-14 17:21:55
511
1
原创 AtCoder Beginner Contest 359
交换m次,找找性质,我们可以发现除了第一个位置,后面每一个位置的概率是一样的,因为是随机抽取,我们计算概率即可,每一次都是n^2次,然后1.黑黑:1种 2.白白(n-1)^2,剩下的就是黑白,随机的给除了黑点的其他点,然后一个g1表示第一个点概率,g2表示其他点的概率,然后dp即可。左边的可以遇到右边的右边可以遇到左边的,可以考虑固定一边,如固定朝右边走的,那么对于每一个左边的点x可以碰到的点范围就是[x-2*m,x],观察数据范围使用离散化+前缀和即可。读懂题目直接按照题目模拟即可,数据范围较小。
2024-07-10 21:22:58
478
原创 AtCoder Beginner Contest 361
有个明显的思维就是直接枚举每一个次方,当时为2的时候有1e9个数(1e9^2==1e18)当然会超时,这个时候没有更好的做法,我们考虑不使用2次幂,直接从3次幂开始,则最多1e6个数,符合要求,同时对于2次幂当独计算,答案数量就是sqrtl(n),当时有些数既是x的次幂又是y的次幂,所以要用set去重,同时注意不把2次幂的数放入set,最后直接加上即可。明显的字符串交换,也就是bfs搜索找最优解,类似八数码,用一个unorderde_map<string,int> 判断是否出现过即可。
2024-07-09 21:48:19
376
原创 2024ICPC湖北省赛
逻辑推理,我们可以发现对于整个棋盘影响作用有效果的其实就是10个点左右,因为轰炸的范围是5个格子当两个点交叉的时候会产生两个最优的位置,10个点的话最多也就是10个,如果是只能影响到一个放鱼位置的话直接处理即可,对于其他点可以直接暴力维护时间复杂度就是。同时考虑到是多组输入我们可以得到每次的操作次数一定是不多的,通过简单的枚举和推理可以得中间最多五个数左右,我们可以直接使用两个数的约数也是可以的,同时加上2来处理。题目是英文的,实际上就是要a*b最大,明显的a等于1的时候这两个数最大,也就是,答案就是。
2024-05-20 22:07:31
959
原创 2021辽宁省大学生程序设计竞赛(正式赛)
比赛经过:写了七八题,有一个topsort写错地方了,本场题目都较为简单考的知识都比较明显补题:有些题目还得多思考其实也不难。
2024-05-16 20:20:58
354
1
原创 2020 年第一届辽宁省大学生程序设计竞赛
比赛经历:摸鱼划水了一个多小时又是只会签到,看来还得提升自己的解题能力写了六题补题:E线段树维和区间平方和,比较经典好久没写过线段树了傻了,注意维护lazyJ计算几何,看来得提上日程了,用叉积判断位置k题意看起来难爆了,没想到竟然做法如此优秀,所以有些题还是得多尝试。
2024-05-16 11:13:02
740
原创 2024CCPC郑州邀请赛暨河南省赛
比赛记录:看群里大家嘎嘎拿牌,自己个人来solo了一下,发现简单到中等题很多,写了两小时出了7题,但是写的比较慢,对难题把握还是不准确补题 : A题确实巧妙充分利用题目的数据范围来思考问题,D简单数数性质推理。
2024-05-15 09:16:39
1172
原创 第四届辽宁省大学生程序设计竞赛
比赛经历:2024.5.14简单vp了一个小时只写出了签到题4个然后跑路了补题:感觉其他题有点太抽象了主要补了一题,在区间问题中数据结构的使用。
2024-05-14 19:45:12
426
原创 2023 广东省大学生程序设计竞赛(部分题解)
我们可以注意到题目要求路径上的mex最大,如果x是可以的那么[1-x]一定是可以的,同时如果x不可以那么[x,..]一定是不可以的,所以具有二分性质,现在核心就是二分,我们可以发现路径一定是右下的走法,也就是满足要求的j一定不会比上面满足要求的j要小否则就是往回走了,由此我们可以得到二分的写法。,为前缀的点同时随着i的增大j一定是同时增大的变化,所以可以考虑使用优先队列维护dp即可,同时注意怎么判断最后答案是上面,我们可以++n这样满足答案就是。银牌-金牌题:trie树+dfs贪心。
2024-05-01 14:58:11
1371
2
原创 双指针的引入和深入思考(持续更新中)
此时我们发现如果是在上一题的基础上我们移动做指针是无法维护区间的的性质的,因为我们无法从一个满足要求的区间中得到这个区间俺的全部贡献所以直接双指针是不可行的,任意选择区间中的点得到的结果就是题目要求的
2024-04-17 23:05:08
703
原创 Codeforces Round 521 (Div. 3)
的时间复杂度来通过本题,我们在上题的分析基础上分析,可以发现dp[i](选的第i个数的转移来源 一定是选的第i-1个数)所以考虑对此优化,当我选第i个数的时候选到第j个位置时,后面的选到第j+1的数只能由dp[i-1][(max(0,j-k),j]组成这个状态的变化可以通过在转移j的同时用单调队列优化上一层的状态,这样就是满足要求的时间复杂度。注意厘清题目意思,对于每一个数我们只在乎的是它的数量,然后对于题目意思的翻倍处理可以明显的知道最多只会处理20次以内。
2024-04-12 19:25:40
918
原创 Codeforces Round 515 (Div. 3)
几何中的dp,我们考虑如果是在同一个大小状态之下,我们可以按照从最左下到最右上的顺序或者是反之,(中间点就在两个点的曼哈顿距离中)最后一定是在这两个位置中的一个取转移下一个位置,所以不妨直接对这两个状态来进行转移。前缀和思路,对于每一次除以之后的操作其实就是整个大于等于这个位置的前缀的数和这个位置数的操作,所以可以直接对其做一个前缀和即可。左右插数,考虑使用的对左右的数用正数和负数来区分即可,如果查询的数是左右两边注意减去0所占据的位置。,为了便于处理是否是被装在盒子里,我们可以直接用数组来表示盒子即可。
2024-04-11 20:48:24
273
原创 Codeforces Round 937 (Div. 4)
首先我们来看看无解的情况可以发现只有2的度数会给后面带来需要接的点,带来入度,所以最后就是a+1的入度 a+1==c才是有解可以发现如果我们要树的高度低那就是按照满二叉树的方式构造即可,所以我们直接按照先构造2的方式即可,接着处理1的数,1的数量,最后处理没有入度的点。我们可以发现我们要求的是这个数得要用0101构成的穿的乘积构成,所以我们可以看直接用约数的乘法同时要求这个数是01这样的数即可,注意从大到小的枚举同二进制数取数一样因为有些01数可以由小的01数同其他数的乘积构成。直接按照题意模拟即可。
2024-03-29 21:31:55
683
原创 Codeforces Round 506 (Div. 3)
区间的拼接,我们可以发现最后是由两个部分组成一个是前面的一个是后面的,前面的贡献来源于本身以及后面数的数位,所以我们考虑预处理每一个数后面添加数的位数之后的贡献,然后对于后面的数只需要去找这个数在后面的时候的答案贡献即可(注意自己和自己拼接)我们有个明显的贪心策略就是从权重最大的人的父节点开始操作,如果他的父节点被标记了的话就直接把他父节点的儿子节点也标记,同时注意如果可以在dfs外操作的尽量在dfs外操作否则就一定要理清楚是不是可以递归的,此题我们采用外面取操作即可。
2024-03-28 19:19:03
427
原创 Codeforces Round 501 (Div. 3)
考虑到我们要找的数十字,一个十字的大小是由左右上下的点的数量决定的所以我们先预处理出来(可以双指针或者是直接继承的方式如下代码)每一个点左右上下连续的点的数量,然后星星就是枚举每一个点找四周最小的即可,接着对于处理这个点是否被使用过我们可以考虑使用二维差分即可。非常经典的目标字符串出现的题目,我们考虑使用kmp+dp处理,同时考虑这个题目的括号特性我们需要开一个维度来记录当前这个括号匹配到了即可,规定过括号为+1,右括号为负1即可。我们定义dp为构造了i个,当前括号的匹配值是j,同时匹配到了第k个数。
2024-03-26 00:05:25
358
原创 Codeforces Round 498 (Div. 3)
我们敏锐的发现如果可以变成一半的话就是可以通过的,于是我们想到可以折半搜索,所以可以得到答案,于是我们开map来记录路径即可,同时注意到一半是(n+m)/2的位置即可。2 a a b b 0次 a a a b 1次 a b a a 1 次。由题知一定是选出最大的m个数然后对这m个数分配线段即可,最后一个是到n。3 a a b c 2次 b c a a 1次。前后缀相等明显的就是双指针,按照双指针的方式来移动使得相等即可。4 a b c d 2次。
2024-03-22 21:36:25
368
原创 Codeforces Round 496 (Div. 3)
我们对于求解满足要求的区间数量首先分析,要求是恰好中位数是m的区间数,如果直接求解这样的区间数量是难以解决的,但是我们利用前缀和的思维我们可以简单求解出中位数大于等于m的区间个数,[l,r]对于这个区间只要。最短路径树,我们可以直接按照dijkstra的方式求解即可因为我们要的是根节点到其他的点的路径的最小值,所以不同于最小生成树,同时考虑存起来每一个点的前驱节点。题目是判断是否是存在2的幂次,可以简单得到对于x如果y是对应数,那么对于y,x也是他的对应数。
2024-03-21 20:37:07
354
原创 2024牛客寒假算法基础集训营6
我们来找一下性质,也就是说如果b,c中任意取一个数出来都是gcd等于1说明如果两个数有其他公约数的话一定都是在一个数组里面比如 2,4一定是在一起的,也就是手说他们之间是有一条边的所以我们可以考虑把所有数的约数筛选出来,然后对他们的倍数进行连边,最后利用最小生成树的思路来合并,如果说都合并在一起那就是不可,否则可行。题目意思明显的就是不能有大于等于2的回文串,所以就是考虑只有三个字母也就是red,的排列,同时考虑竖着的也就是12种情况,我们可以先构造出来然后按照二维前缀和的方式来维护求和即可。
2024-03-11 21:52:07
567
2
原创 2024牛客寒假算法基础集训营5
首先对于这种题目发现性质,可以明显得知如果是1或者是偶数是一定有解的,对于奇数我们如何操作呢,可以发现最后一个数是奇数是不可以操作的也就是我们的限高,然后我们发现操作的越多是越有利的,如果我们从前面开始的话不可知上限由于后面的数还会变化,但是我们从后面开始的话上限是可知的,同时可以保留每次的处理,所以我们倒着来每次都处理到上限位置即可,然后判断是否有解,对于求解操作次数我们发现如果是有解的话那么一定就是每一次操作都可以减少最大的一次所以我们的操作次数就是其中的最大差值。这样的a,或者是b都是一次。
2024-02-29 21:30:49
974
原创 2024牛客寒假算法基础集训营4
数组划分问题,我们要求的是k倍数的数组,那么直接从前面开始即可,一直统计前面出现的余数的出现,如果说加上后面这个数出现了前面出现过的数,或者说现在满足的那就是取到当前这个位置即可,一般的划分问题都是这样。简单思维,我们可以发现又是典型的加一减一操作那么总和一定是不变的,由于操作次数不限制,那么这个数组可以随意变化,要找的是最大公约数只要sum%x==0都是可以做到的。简单模拟,可以发现明显的数据范围很小的这件事情我们计算一下直接模拟所需要的时间,发现是可以通过的所以直接暴力模拟即可。
2024-02-29 20:55:47
552
原创 2024牛客寒假算法基础集训营3
这依旧是两个数的缝合,我们考虑缝合后对这个模数的影响是什么,由于只有10e18也就是最多是18位数那么每一个数后面都最多接上18位数,我们可以把合成的数看成两个部分前面和后面,这个时候我只需要对每一个数合并多少位数的取模值得到即可,接着来计算多少的贡献同时注意题目要求不能自己接在自己身上所以需要特判,数字拼接题都是如此的性质。我们可以发现这是多个关系之间的问题,维护关系我们可以使用传递闭包,也就是floy,同时我们理清楚每一个关系的意思。2 红色不超过黑色的两倍 黑色最多的时候是红色两倍加一。
2024-02-27 18:07:39
962
原创 2024牛客寒假算法基础集训营2
做题的时候特别是计算贡献的时候一定要找到贡献的来源,我们可以发现消除一个数(如果找个数在右边第一次出现)之后其最右边的数都会消失,那么怎么做的贡献最少呢,当然十当前数组的每一个数都出现的时候最优的这样的删除一次删除的数最多可以(j结论明显所以直接用map存书的数量即可然后删除)这种最优性贡献都是如此思考。也就是前面的数的贡献是后面的除以他那么我怎么记录前面的数的贡献呢?我们要计算的是贡献,一个猫带来的贡献是看周围有没有其他的猫导致重复的所以我们就直接用。这是明显的计算贡献的题目我们看边的贡献是啥。
2024-02-27 00:03:18
2506
原创 Codeforces Round 494 (Div. 3)
的时间复杂度来解决,接着我们要的是找到一段相同的然后把整个里面相同的进行缩写处理,不妨先把整个用vector<string> 存储起来,接着我们要考虑的就是相同的长度是多少,接着考虑从什么位置开始,我们 由此可以设置状态。构造一棵树我们可以发现如果是又满足的一定是一条直径是d的我们不妨直接把直径构造出来,然后在其中的点加入限制条件之后直接构造,注意题目的意思是构造出来的树直径就是d所以按照题目要求然后对其中的点扩充即可。先按照01010这样的方式把题目要求构造出来然后往中间插入01即可这样答案不会变化。
2024-02-23 22:27:37
503
原创 Codeforces Round 490 (Div. 3)
我们可以灵巧使用set来解决问题,为什么这样思考呢?我们肯定十一次性对当前这个数%m的值直接变到应该变化的位置是最好的可以用set来存储还没有抵达的位置然后直接变化过去即可这样就是nlog级别的。我们可以发现有贡献的只有对于喜欢同一种类型的人的分配方式,对于这样一个问题我们可以定义状态dp[i][j]i个人分j张牌的最大喜欢值是多少可以由i-1分min(0,j-m)-j转移过来即可。有向图的连接我们考虑使用缩点的方式来解决问题缩点然后重新建图然后看没有入度的点的数量就是答案。按照题目意思倒着来即可。
2024-02-22 23:45:25
387
原创 Codeforces Round 928 (Div. 4)
依照题目意思我们进行对20模拟,同时思考可以知道一开始我们删除了所有的奇数,奇数*奇数=奇数,那么接下来只有偶数的删除才会有用同时如果不是2的幂次的话其他偶数都是可以由奇数*偶数得到的也就是前面的偶数就已经判断过了,所以,只有2的幂次才有删除作用,接着对于2的幂次我们看有多少在其中。判断由1组合成的图形是正方形还是三角形,对于这两个图案我们发现正方形是有规律的可以考虑找到图中1的最远的四个角,如果是正方形的话里面就是都是满的也就是满足四个最大方位形成正方形的面积反之为三角形。
2024-02-22 21:13:21
553
原创 Codeforces Round 486 (Div. 3)
我们明显的可以考虑到dp,有些时候我们可以简单的思考问题我的上一个状态是前面的所有状态还是可以简化位就上一个位置的状态这里明显可以这样来思考这个问题,我们必须要从合法的状态转移过来,也就是我在第i个点手上拿着第几个伞,第0个表示没有伞,然后判断我上一个位置有没有伞我这个位置有没有雨来转移。25的倍数一定是25,50,75,00作为结尾,我们考虑依次移动到后面即可,接着发现可能会出现00的情况我们假设最后是00375我们可以把3移动到最前面即可所以加入一个特判即可。
2024-02-17 15:13:31
389
1
原创 2024牛客寒假算法基础集训营1
首先题目告诉我们的是按位与,也就是只要有1就是1,我们对于位运算的题目第一想法是拆位,我们思考这样一个问题,如果(32位中的一位)对于我这一位我不要了,那么只要在不超过我前面的基础上我后面的是可以任意选的这是一个明显的策略,(当然对于容量而言这一位必须是1),同时我对于所有的和我位置完全一样或者少于等于我的也是ok的,这样我们发现我们考虑了所有的情况,但是怎么去处理又是一个问题-->还得是落脚点在位运算中,我们考虑这一位^1,然后|((1
2024-02-17 14:53:52
801
原创 Codeforces Round 481 (Div. 3)
题目告诉我们关系不会重复不妨这样考虑如果我们从小到大按照能力排序然后对于每一个关系维护前面比他小的有口角的人数,按照他的排序减去有口角的即可,对于相同的数我们在口角中去掉,然后再考虑答案的时候用map来维护前面每一个能力出现的数量再减去即可。简单贪心策略,我们肯定是谁先考试先处理谁他的前面一定是最多的可用空闲时间,然后从他的告诉考试时间考试处理,如果够了就退出,这是一个比较简单且明显的贪心策略,可以简单的证明是正确的。最为经典的前缀和加二分处理,注意我们找到比现在大于等于的然后减去前面的就好了。
2024-02-01 22:23:15
431
原创 Codeforces Round 479 (Div. 3)
这一题是一个简单的dp记录方案我们考虑直接用map来存储,用pre表示上一个节点,idx当前位置,dp表示数量即可表示所有的信息从前完后的去找每一个数的x-1是否存在是一定合理的。每一个数的前后数一定是一一对应的所以可以直接记录,然后我们考虑求倒着用下一位记录前一位这样就可以直接倒推(同时注意开longlong)我们可以发现答案是具有二分性质的如果一个数越大少于他的数只会变多所以考虑二分即可。我们发现一个环上的一定都是每个点都是有两个子节点,这就是这题的性质然后dfs即可。按照字符串也是直接模拟即可。
2024-01-31 21:44:59
347
原创 蓝桥杯 第 2 场 小白入门赛
我们可以发现他具有鲜明的区间修改和变化的操作但是他和我们平常的线段树不同他具有几个物品之间的切换之类的操作,对于这些变化,我们线段树变化的核心在于lazy如何修改我们可以在线段树中用懒标记来维护他们之间的关系,如果是翻倍的话也就是自己和自己的关系,关系如何传递,所以我们用二维数组来充当懒标记来处理,然后再用数组进行pushdown的操作来维护。我们可以先使用线性筛处理出所有的质数,接着对两个质数的中间的数进行左右变化处理最小值即可预处理o(n),然后直接求解即可。对于倍数的累加然后加上剩余的即可。
2024-01-31 20:03:50
686
原创 蓝桥杯 第 1 场 小白入门赛
我们可以发现无论左右结果不会变的那么也就是我们这个结果是不受操作所影响的,所以我们选择最优的操作直接从左到右即可,注意数据范围很大所以我们考虑要使用__int128来处理。我们需要构造的数字最大,由于数位已经告诉我们,所以明显的有一个贪心的策略:从最高位置开始从最大的数开始遍历是否可以填可以填减去看下一位即可。我们可以知道和是一个概率dp,依照题目意思我们定义状态为当前 为x是期望为dp[x](x==i)我们有一个错误的想法就是找出最大的质数x然后直接求长度x的即可,为什么是错误的呢?
2024-01-30 23:28:41
2573
原创 Codeforces Round 918 (Div. 4)
判断中间某一段是否具有特性可以直接从前后来找特性注意完整的从前面和从后面。注意到是明显的二维偏序问题所以我们直接使用树状数组+离散化即可。明显的分层图直接跑一遍dijkstra即可。平方数直接用sqrt检查即可。直接暴力找缺少的是谁即可。直接简单检查一下即可。依照题意直接模拟即可。
2024-01-29 23:53:15
409
原创 Codeforces Round 898 (Div. 4)
注意观察特性,我们发现每一次消耗的都是A的数量,A的数量是不可以再增加的如果说是ABB,或者BBA可以直接消到底如果两边都是A同时中间没有BB那么必然有一段A被丢弃,一段A同一个B结合。先通过递归找到第一个如环的点再通过环上的点去跑原来的路径来找到所有点到这个点的最短距离。这种判断是否能变成目标串的我们都是通过一定手段然后看最后是否是直接变成目标串即可。任意一个数加一等于加上剩下数乘积的两倍所以最小的加1是最优的。明显的是二分如果结果很大记得需要使用LL,以及中间退出。明显的双指针求区间最长一段的性质。
2024-01-29 23:49:48
444
原创 Codeforces Round 886 (Div. 4)
可以通过顺序遍历直接找到最小值或者是直接按照某个要求排序。2.或者直接使用dfs去找是否有不满足的即可。1.注意带权并查集的原理和思维即可。
2024-01-29 23:43:55
409
原创 Codeforces Round 871
dp的状态转移如果是方案数很少的我们就可以用状态机模型然后这个数选择或者是不选择带来的收益即可。接着就是在加入点的时候就进行判断已经进入了避免多次进入无用点超时。注意bfs的时候第一个加入的点要st[x][y]=true;叠罗汉从上到小一定具有性质注意发现和尝试类似前缀和。分类讨论注意情况的数量,是否考虑清楚了。简单进制变化注意次数bfs注意处理重复。注意题目的特征描述,找到和发现性质即可。需不需要数组,直接快速判断。
2024-01-29 23:39:25
847
原创 Codeforces Round 859
我们直接模拟弹弹的这个过程接着我们发现题目提示我们nm的数据范围我们最多弹nm所有点都有了依照鸽巢原理一定会重复所以这个时候推出即可。后面的数一定是由前面的数构成的如果说你这个数比前面的总和还要大是肯定不可能的前面的数可以构造出后面的所有的数所以进行前缀和维护即可。简单交互题一般都是二分我们这里使用前缀和维护然后二分查询是不是满足然后改变中间mid即可。直接第一个变成0或者1都行后面一定会对应变化如果是出现相等就不行。简单区间查询直接使用前缀和进行维护即可。先偶数再奇数即可所有只需要看总和。
2024-01-29 23:32:48
397
原创 Codeforces Round 849 (Div. 4)
我们考虑这样一个问题也就是如果上一个点走完了我去完0或者是n+1都是可以的取决于谁带来的贡献小,于是有这样一个贪心,每一个点一定是从左边或者右边来的,接着第一个点一定是从左边来的所有我们枚举第一个点的位置减去他的共享接着来算选了多少个点,如果重复算了这个点的话我们就重新计算他带来的贡献即可。我们发现这种操作次数不是很多的同时是维护区间性质的,维护区间的变化同时又要查询我们可以考虑使用树状数组。我们可以发现如果后面的没了也就是前面的有了我们可以直接从前面来变化记录后面的。变化同时就可以记录前面的变化。
2024-01-29 23:28:13
346
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人