自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(370)
  • 收藏
  • 关注

原创 独立游戏《星尘异变》UE5 C++程序开发日志3——实现一个存存组件

本篇日志中,我将会介绍如何实现一个有格子,每个格子有容量的物品库存,如下图:

2024-05-13 23:20:20 335

原创 独立游戏《星尘异变》UE5 C++程序开发日志0——游戏介绍

星尘异变》是一款由来自中国传媒大学的6名在校学生制作的一跨能独立游戏,在游戏中,玩家需要扮演一个宇宙中的“神”,开采宇宙中分布在“星云”内部的“星尘”,消耗“星尘”来建造“天体”作为生产更多“星尘”以及产生其他效果的的工厂,完成各种任务的同时,妥善经营所有的“天体”使“熵增”不要达到上限,否则游戏会直接结束,每完成一定量的任务,主星都会发生“进化”,解锁包括物流系统等新的功能,使主星进化到最终阶段来通关当前关卡。游戏预计将登陆steam平台。

2024-05-13 11:43:13 254

原创 Tree Cutting Codeforces Round 936 (Div. 2) 1946C

那么很容易想到的就是进行dfs,后序维护当前点u的子树大小siz[u],如果siz[u]>=x,那么这个点和它父节点之间的边就要断掉,使用的边的数量tot+1,然后令siz[u]=0,使其不影响后序的dfs过程,但如果当前点时根节点也就是1号点,它没有父节点,所以tot不能+1,而且如果以1为根的子树的大小=x。那么接下来考虑在确定了某个x的情况下求需要移除的最少边数,因为按照上面的单调性,移除的边数越少x越大。

2024-03-25 11:36:42 291

原创 小苯的三元组 2024年中国传媒大学程序设计大赛

因为lcm(a,b)=b,所以a是b 的因数,因为gcd(b,c)=b,所以c是b的倍数,那么我们如果知道b有多少个因数在数组中,记为cnt1[b],有多少个倍数在数组中,记为cnt2[b],那么以b作为三元组中间的那个数时就有cnt1[b]*cnt2[b]个合法三元组。题目大意:给出一个n个数的数组,问有多少个三元组(a[i],a[j],a[k])满足lcm(a[i],a[j])

2024-03-21 11:56:58 269

原创 Tree Compass Codeforces Round 934 (Div. 2) 1944E

我们操作4 1 、4 3、5 1、5 3,只需要4次,如果只操作一个中点就需要5次,少一次的原因是我们每次操作都涂黑了至少2个点,只操作一个中点 的话必然会有只涂黑一个点的操作,而要想每次操作都涂黑至少两个点也需要直径的点数是4的倍数,这样才能两个中点交叉操作,所以只需要分两类讨论即可。思路:要想操作数最少,就要使每次操作涂黑的点的数量尽可能多,那么也就是要找这棵树的中心点,而这样的点一定在树的直径上,也就是树上的最长链,直径可以通过两次bfs找最远点或者一次树上dp来找,这里只讲树上dp做法。

2024-03-21 11:07:00 472

原创 Tandem Repeats? Educational Codeforces Round 163 (Rated for Div. 2) 1948D

假设我们已经确定了当前要匹配的str的长度为len,那么要做的就是当前位置i和i+len的位置进行匹配,如果能匹配就就分别后移两个指针,直到匹配的字母数等于len,如果不匹配,因为要匹配的位置都是固定好的,所以下一个要匹配的位置就是失配位置的下一个位置。题目大意:给出一个字符串s,s中可能存在能代表任意字母的?思路:要找这样的合法子串相当于找一个长度为len子串str,使得这个子串,后面的len个字母组成的字符串和str相同,所以我们首先要确定的就是这样的Str的长度。2

2024-03-16 14:04:55 531

原创 独立游戏《星尘异变》UE5 C++程序开发日志2——实现一个存储物品数据的c++类

在本篇日志中,我将会介绍游戏内最基础的物品:“星尘”数据类的实现,其中包括UCLASS,USTRUC的实现,以及FName,FStriing,FText的区别和转换,TArray,TMap的使用,UENUM的实现,TSharedPtr的实现,数据表格DataTable的读取

2024-03-03 23:23:46 792

原创 独立游戏《星尘异变》UE5 C++程序开发日志1——项目与代码管理

本日志系列将会向大家介绍在《星尘异变》这款模拟经营游戏,在开发时用到的与C++相关的泛用代码与算法,主要记录UE5C++与原生C++的用法区别,以及遇到的问题和解决办法,因为这是我本人从ACM退役以后第一个从头开始的项目,所以如果有问题,欢迎大家移除交流。本游戏预计日后将会在steam平台上线,敬请期待。本篇日志将会介绍在床架一个UE5空白项目后,如何生成对应的VS文件和管理相应的文件。

2024-03-03 00:13:49 854

原创 Good Trip Codeforces Round 921 (Div. 2) 1925D

然后从2到k枚举每个匹配对被选中的次数i,被选中i次的累计贡献为(0+i-1)*i/2,因为每次被选中的概率psel独立等概符合二项分布,所以被选中i次的概率为C(i,k)*(psel)的i次方*(1-psel)的k-i次方,再乘以m,将所有贡献相加,注意预处理逆元和取模即可。考虑怎么算初始贡献的期望,每个匹配对被选中的概率psel=1/C(2,n),k轮中被选中的次数的期望就是k/C(2,n),再乘以贡献z,z*k/C(2,n)就是单个匹配对初始贡献的期望,可以O(m)的时间求出。

2024-01-29 16:17:36 507

原创 Did We Get Everything Covered? Codeforces Round 921 (Div. 2) 1925C

因为每个合法段中可能夹杂着其他的字母,比如k=3时aabbcc是一个合法段,那么要排除多余字母的影响,就应该选取这个合法段中最后一个字母加入到反例中。当n等于2时,k个字母各出现一次后,所有字母还要再出现一次,所以最短的合法字符串就是前后各一个合法段拼在一起,每个合法段内部的字母顺序不影响。同理,n等于几就要有几个合法段。那么我们可以尝试在s中找合法段,每当k个字母都至少出现一次就是一个合法段,如果找到了n个合法段,就是YES,否则就是NO,然后考虑怎么找反例。1

2024-01-28 16:28:14 689

原创 A Balanced Problemset? Codeforces Round 921 (Div. 2) 1925B

思路:我们设n个数的公因数是y,那么这n个数都应该是y的倍数,也就是y*n应该=n的最大的因数即可。题目大意:给出一个整数x,要求将x分成n份,使得所有份的最大公因数最大,求这个最大的最大公因数。

2024-01-28 15:39:50 525

原创 Add, Divide and Floor Educational Codeforces Round 158 (Rated for Div. 2) C

思路:因为要让所有数都一样,那肯定让所有数都变成原数组中的数能使操作次数最少,那么我们不妨让所有数都变成数组中的最小数,这样我们就要让每次操作的x,这样对于每个数,它的操作次数就是log2(a[i]-x),所以我们先找到最小值,然后每遍历一个数,就求出它需要变成最小值的操作次数即可。题目大意:有一个长度为n的数组a,每次操作可以选择一个数x,对于所有的i属于1到n,令a[i]=(a[i]+x)/2,要求令所有数都相等,问需要的最小操作次数是多少。

2023-12-15 16:50:13 417

原创 Colorful Grid Codeforces Round 910 (Div. 2) C

思路:首先如果要从(1,1)走到(n,m),最短路径上的线段数len=n-1+m+1,如果k

2023-12-14 20:23:45 515

原创 Chip and Ribbon Educational Codeforces Round 158 (Rated for Div. 2)

可以发现每一块积木刚好用一次操作1即可,操作2实际上就是从一个积木转移到另一个,那么操作2的次数其实就是积木数-1,积木数量增加的时候,也就是a[i]值增大的时候,增加的数目就是a[i]增加的值,所以最终操作2的数量也就是max(0,a[i]-a[i-1])1.设指针当前位置为l,可以选择一个任意位置r(r>=l),使[l,r]内所有数+1。问对于一个初始有n个0的数组,最少要多少次操作2能使其等于a数组。2.将指针移动到一个任意位置,并令那个位置上的数+1。

2023-12-14 19:51:52 875

原创 Milena and Admirer Codeforces Round 910 (Div. 2) B

我们从n-1遍历到1,如果当前a[i]>a[i+1],那么这个数就应该分割cnt=a[i]/a[i+1]次,平分出来的数就是a[i]/(cnt+1),特殊的是如果能a[i]能整除a[i+1],那么整除次数要-1,当遇到a[i]=1时,再往后的数就都必须分割成1了。思路:因为要让数组变成非递减的,所以对于某个a[i],如果其>a[i+1],那么就要对其进行操作,无论最后进行几次操作,都应该满足,分出来的这些数是非递减的,最左边的数要>=再左边的一个数,最右边的数要

2023-12-13 10:37:04 457

原创 F. Alex‘s whims Codeforces Round 909 (Div. 3) 1899F

题目大意:有q次询问,每次询问给出一个数x,要求构造一棵n个点的树,使得对于每次询问,树上都有一条简单路径的长度等于x,同时每次询问前可以对树进行一次操作,即将一个点与其父节点的边断开,然后和其他一个点连边,操作后的图必须仍是一棵树。然后对于任意一个询问的数x,我们只需要把n号点连在编号x上即可,这样1到n的距离就等于x,只需维护n号点当前连在哪,如果已经连在x上了,就输出-1-1-1。

2023-11-18 14:49:38 241

原创 D. Yarik and Musical Notes Codeforces Round 909 (Div. 3) 1899D

思路:用快速幂打个表发现满足条件的a[i],a[j]要么a[i]=a[j]要么一个数等于1,另一个等于2,所以我们只需对于每个数,求出它后面有多少与它相等的数,如果是1或2再特判一下后面2或1的数量。题目大意:给出一个n个数的数组a,问有多少对i,j满足i

2023-11-18 14:34:12 226

原创 C. Yarik and Array Codeforces Round 909 (Div. 3) 1899C

思路:首先考虑忽略奇偶性限制怎么求最大子串和,首先我们初始化答案ans为数组中所有数的最大值,然后我们遍历数组同时记录当前选择子串的元素和sum,对于数组中的每一个数,如果当前的sum已经小于0了,那就重置sum为当前数,因为如果当前数为正的,显然应该直接换,如果是负的,加上只会更小,除此情况之外就直接加上当前数即可。考虑奇偶性条件,也就是当奇偶性不满足的时候,sum也要重置为当前数,因为已经不合法了,所以多加一个和前一个数记起来是偶数就重置的条件即可。

2023-11-18 14:23:04 183

原创 J. Joy of Handcraft 2020 China Collegiate Programming Contest - Mianyang Site

思路:对于一盏灯,它打开的时间段是[1,a[i]]、[2*a[i]+1,3*a[i]]...,对于m的时间内,每盏灯最多有m/a[i]/2个区间,我们对于每一个a[i],只保留一个最大的亮度值,这样最多1e5个a[i],枚举区间的复杂度是O(n*logm),然后用线段树维护最大值时间复杂度O(n*logm*logm)题目大意:有n盏灯和m秒,每盏灯会开a[i]秒然后关a[i]秒然后再开a[i]秒,依次循环,灯打开后,就会产生b[i]的亮度值,问m秒内每一秒最大的亮度值是多少。

2023-11-13 08:33:07 93

原创 D. Doremy‘s Connecting Plan Codeforces Round 906 (Div. 2)

思路:令当前已有的一个连通块为s,我们要找一个点j和s连通,那么我么肯定选择连通块中编号最小的一个点i,使i*j*c最小,如果s内的和+a[j]>=i*j*c,i和j就可以连通,既然i*j*c已经小于等于当前连通块的和,那么对于小于j的所有编号i*j*c都一定小于等于。题目大意:有一个长度为n的数组a,同时有一个n个点的图,编号与数组的编号对应,初始没有边,如果当前连通块的中a[i]的和+某一个点a[j]>=连通块的一个点i*某一个点j*c,那么就可以连通i和j,问能否使所有点在一个连通块内。

2023-11-02 13:13:33 120

原创 B. Long Legs Educational Codeforces Round 146 (Rated for Div. 2)

那么考虑x取何值时,(a-1)/x+1+(b-1)/x+1+x-1也就是(a+b-2)/x+x+1最小,我们发现此式的前一部分y1=(a+b-2)/x是单调递减的,y2=x+1是单调递增的,那么我们只要找到在哪里这两个函数的变化幅度相同,也就是求解y1=y2,移项化简得x约等于sqrt(a+b),根据a+b的范围和测试数据组数,我们从1到1e5枚举x,一定就能找到全局最小值。

2023-11-01 18:37:49 143

原创 C. Smilo and Monsters Codeforces Round 907 (Div. 2)

思路:因为大招可以花一点费用杀死很多怪,性价比肯定比普攻高,且大招一次消耗的能量越多越赚,要消耗更多的能量就要选择怪的数量尽可能多的堆施放大招,所以我们按怪的数量从小到大排序,建立双指针l=1,r=n,前面怪数量少的我们用普攻,如果当前积攒的能量达到a[r]了,就用大招消灭a[r],这样最终可能会剩余1堆,那么除去当前大招能杀死的以外,其他的一半向上取整都要用普攻,然后其余的一个大招杀掉。

2023-10-31 23:27:55 281

原创 D. Suspicious logarithms Codeforces Round 907 (Div. 2)

这时有两种情况,g(x)+1的地方也就是now*i有可能在当前枚举的区间外,这个区间的贡献就是(r-l+1)*cnt,另一种情况就是g(x)+1的地方在区间内,这个地方已知是now*i,那么这个区间的贡献就是(now*i-1-l+1)*cnt+(r-now*i+1)*(cnt+1),这样枚举i直到2的i次方大于上限R,就能得到g(x)x属于1到R的答案,我们令R=询问的r和询问的l-1,分别求出相减即可。

2023-10-31 22:21:23 419 4

原创 J. Similarity (Easy Version) 2023 Jiangsu Collegiate Programming Contest, 2023 National Invitational

思路:对于两个字符串s1,s2,令dp[i][[j]表示s1的前i个字符和s2的前j个字符中的最长公共字串的长度,遍历s1同时遍历s2,如果当前遍历到的两字符相同,那么就从两个字符串的上一个位置转移过来+1,dp[i][j]=dp[i-1][j-1]+1,否则dp[i][j]=0,dp[i][j]的最大值记为最长公共子串的长度。题目大意:有n个字符串,问这些字符串两两匹配的最长公共子串的最大长度是多少。

2023-10-26 20:19:19 110

原创 B. 看比赛 The 10th Jimei University Programming Contest

思路:因为直走最短路,所以我们把所有在最短路上的边都要选出来,建成新图,为此,首先用dijkstra求出1到n的最短路的长度,然后我们从n开始bfs,遍历相邻边,如果这条边的边权加上1到这条边起点的最短路距离等于1到这条边终点的最短路距离,那么就把这条边加到新图中,最后就会形成一个包含1到n的所有最短路的DAG。

2023-10-26 19:48:50 237 3

原创 D2. Dances (Hard Version) Codeforces Round 905 (Div. 2)

我们令a[1]=1时的答案为ans,在我们增大a[1]到m的过程中,可以发现区别就是可能之前a[1]不用删,增大后要删,那么答案相差就是0或1,且操作次数是随着a[1]增大而增加的,所以我们可以二分枚举1到m找到答案+1的位置,也就是找到一个x使得a[1]=x时得到的答案与ans不同,这样前边的数量*ans后边的数量*(ans+1)就是最终的答案。

2023-10-24 10:57:15 117

原创 D. Counting Rhyme Codeforces Round 904 (Div. 2)

思路:如果两个数能同时被一个数整除,那么这两个数的最大公因数也能被这个数整除,所以如果一个数x在a中出现或者是a中的数的倍数,那么以x为gcd的数对都是非法的,如果不存在x%a[i]=0那么以这样的x为gcd的数对都是合法的。题目大意:有一个长度为n的数组a,如果对于一个数个(a[i],a[j])满足不存在a[k]既能整除a[i]又能整除a[j],则称这个数对是合法的,求合法数对的数量。

2023-10-24 09:27:28 153

原创 C. You Are So Beautiful Codeforces Round 905 (Div. 2)

那么假如我们当前新添了一个数a[r],那么新增的合法答案计数就是a[r]为区间右端点的合法子串,也就是看1到r中有多少个l满足[l,r]是合法区间,我们发现,对于前面的一个数a[i],如果它出现了多次,那么只有第一次出现时作为区间左端点才是合法的,在后面出现时那个数都可以被第一次出现的那个数替代,所以每个位置的数的贡献也就是在它前面第一次出现的数的数量,那么每个相同的数的贡献,也就是在最后出现的那个位置之前有多少第一次出现的数。

2023-10-22 21:52:52 837

原创 C. Medium Design Codeforces Round 904 (Div. 2)

思路:我们设取得最大值的位置是i,我们要让这个最大值最大,那么所有包含这个位置的区间都要选,并设这些区间去掉重合部分后组成的大区间为[L,R],那么这个区间内最小值的取值位置一定是L或R,因为假如最小值的取值位置在LR里面,那么可以把这个位置左边或右边的区间删掉同时另一边的最大值仍然等于原来的最大值,最小值又变成了新的大区间的端点。题目大意:有一个长为m的数组初始全为0,有n个区间[li,ri],每选择一个区间就要令区间内所有数+1,要求选择一些区间,使得数组的最大值-最小值最大,求这个差值。

2023-10-22 18:15:45 533 3

原创 回文数 洛谷 - P1015

题目大意:给出一个数n和一个100位以内的n进制数s,每步操作令s=s+s的头尾翻转,问30步操作内最少多少步能将s变成一个回文数。思路:因为最多只有30步,100位数,所以模拟的时间复杂度肯定够,直接上高精度非10进制加法运算模板。2

2023-10-20 15:43:01 125

原创 H. Mad City Codeforces Round 898 (Div. 4)

所以我们先跑一个dfs找到所有环上的点,然后再以b为起点,找到b距离环上的哪个点最近,且是哪个点,然后再从a出发跑bfs找到b到那个点的距离,如果b一开始就在环上且到那个点比a更近,就有必胜策略,同时如果ab重合一定没有必胜策略。题目大意:有一个n个点的图,有n条边,西安有两个人A,B分别位于点a/b,每轮两个人同时开始向相邻点移动,问B有没有可能永远不和A汇合。思路:如果要永远不汇合,那么他们最终肯定在一个环里,而边的数量等于点数,说明图中有且只有一个环,那么B只要比A先到这个环即可。

2023-10-19 15:39:49 117

原创 F. Minimum Maximum Distance Codeforces Round 903 (Div. 3)

如上图,从4出发找到最远的点2,但右边的5距离2更远,这时候因为2已经是最靠左的一个点了,所以只要再从2再跑一遍bfs,找到的最远的点和2一定是距离最远的两个点,类似于问以哪个标记点为根,能找到根到标记点的最远距离。显然,在标记点2、4之间的点是才可能是取得最小值的点,因为如果在某一个点一段的话,这个最大值一定大于两个标记点之间的距离,而在中间的点一定都是小于这个距离的,那么在这两个点之间很显然最中间的点是取得最小值的点。

2023-10-17 16:38:28 158

原创 E. Block Sequence Codeforces Round 903 (Div. 3)

思路:设dp[i]为所有小于等于i的位置都已合法,那么如果要要删除a[i],dp[i]就应该等于dp[i+1]+1,如果不删除且它是一个合法子串的第一个数,那么dp[i]就等于dp[i+a[i]+1]+1,如果是合法子串中其他位置的数就是dp[i],我们从后往前遍历,三种情况取最小即可。题目大意:有一个长为n的数组a,对于一个子串b如果b[1]=子串长度+1,则称这个子串合法,现每次操作可以移除一个a[i],问最少几次操作可以将a分割成多个不重合的合法子串。

2023-10-17 11:40:49 172

原创 D. Effects of Anti Pimples Codeforces Round 902 (Div. 2, based on COMPFEST 15 - Final Round)

思路:假如没有涂绿色这个操作,每次都只求黑色的最大值,那么对于每个数a[i],它的贡献就是在所有

2023-10-10 11:28:53 226 1

原创 C. Decreasing String Educational Codeforces Round 156 (Rated for Div. 2)

但这样遍历ans次时间复杂度显然不能接受,通过进一步观察发现,我们要删ans个字母时,在找到一个当前字母大于下一个字母的位置时,要往前检查前面的字母是否也大于下一个字母,如果大于,前边的也要删,所以我们用栈去维护最终的s[ans],只要当前栈顶字母>当前字母,就将栈顶字母弹出,最终栈内的字母形成的字符串的前缀就是s[ans],这个字符串中的第N个字母就是答案,后缀是没有影响的,所以有时不用。s[1]长度不超过1e6。

2023-10-10 09:51:12 234 2

原创 UVA - 10765 Doves and bombs

思路:也就是求每一个割点出现在几个双联通分量(没有割点的图)中,找双连通分量也是用tarjan,dfn[u]表示u是第几个遍历到的点,low[u]表示从u出发在不经过父子边的情况下能到达的最早的祖先的dfn值,而如果一个点是割点,那么在不经过该点的情况下无法到达该点的祖先也就是low[v]>=dfn[u],注意特判起始点的情况,它可能是假割点。题目大意:有一个n个点的图,求每个点如果被删除后,图中剩余连通块的数量。

2023-10-06 22:13:57 152

原创 UVa11324 - The Largest Clique

思路:根据建新图的规则可知,一个点会和它能到达的所有点构成一个合法的分量,那么从入度为0的点开始组成的这样一个分量一定是最大的,但是因为图中有环,所以没法直接统计这样的分量的大小,所以要先用tarjan将所有强量通分量缩成一个点,再在新图中用记忆化搜索找上述的分量。题目大意:有一张n个点m条边的图,现对于每一个点u,建立一条边连接它和所有它能到达的点,问满足所有点之间都有边的分量的大小最大是多少。

2023-10-05 23:16:30 112

原创 Cheerleaders UVA - 11806

思路:因为合法的方案数不好考虑,所以考察不合法的方案数,我们设第一行没有黑格为A,第一列没有黑格为B,最后一行没有黑格为C,最后一列没有黑格为D,根据容斥原理有:非法方案数=-A-B-C-D+AB+AC+AD+BC+BD+CD-ABC-ABD-ACD-BCD+ABCD,这些都可以用组合数算,就是从除了选中行/列以外的格子里选k个,例如A=C[n*m-m][k],AB=C[n*m-n-m+1][k]。

2023-10-03 19:56:47 129

原创 D. Jellyfish and Mex Codeforces Round 901 (Div. 2)

那么我们令dp[i]等于MEX等于i时的最小花费,我们从MEX到0枚举i,同时枚举该删哪个数,也就是从0到i-1遍历,当前最小花费就是不删这个数dp[j],或者删这个数也就是dp[i]+当前MEX*(这个数数量-1)再加这个数,转移方程为dp[j]=min(dp[j],dp[i]+i*(cnt[j]-1)+j)题目大意:有一个n个数的数组a,数m初始为0,每次操作可以删除任意一个数,然后m加上那个数,求n次操作和m的最小值。

2023-10-03 12:22:08 252

原创 C. Card Game Codeforces Round 899 (Div. 2)

思路:可以发现,如果取了某个位置i上的数,那么它后面的数都可以任取,因为对于它后面任意一个位置j,如果j是奇数,就先取j,奇数位置上的数处理完后,再取i,然后后面原来是偶数的j都变成了奇数,这些j也都可以取了,这样就代表j都是任取的,只不过偶数位置上的数不能算在贡献里。题目大意:有n张牌,每张牌上有一个数字a[i],每次操作可以选择一个奇数位置上的数,将其移除并获得上面的数,或者移除一个偶数位置上的数,每次移除后,所有数的位置都会对应紧凑,操作数量任意,问获得的数的和最大是多少。

2023-09-26 11:34:45 223

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除