- 博客(197)
- 收藏
- 关注
原创 AcWing 166.数独
其中,对于在某一个位置填入数的时候r,c,b的变化可以写在函数里,使程序更加规整。而r[i]代表第i行,能填入的数是哪些,如果能填入则相应的二进制位为1。这道题一看起来就很麻烦,但是可以用bitset进行优化。c代表行的,b代表块的。
2025-04-11 16:53:40
146
原创 AcWing 164. 可达性统计
用unsigned int和unsigned longlong只能达到32位和64位,而bitset就可以满足该题位运算的需求:30000位。当然你可以用set加上STL的集合运算函数。bitset,豪用!
2025-04-09 11:08:57
207
原创 AcWing150.括号画家
1.如果在栈处理的过程中出现了不美观的序列,显然之前的左括号都没用了,因为如果和右边出现的右括号match了,也因为包含不美观的序列,而不美观,所以此时把栈清空。无论是用一个变量记录左括号出现的次数还是将一个美观的序列作为一个元素放进栈里,操作起来都感觉太麻烦了(我是这么觉得,或许可能是我最近脑子一团浆糊导致的)所以我最后想出一个办法,即把一个美观的序列的长度放在这个美观的序列左边的左括号,就可以完美解决相邻和包含这两个关系的判断。这题看一眼就知道是用栈来做,但是如何处理两个连续的美观序列?
2025-03-22 11:51:01
275
原创 AcWing147. 数据备份
考虑只选择两对办公楼的情况(选择2个数),先选择最小的一个数,那么这最小的数旁边的两个数就不能选了,接下来的情况有两种:1.选择除不能选的三个数外最小的一个数。那么解法就出来了,每次在数列中选择最小的一个数,删去他和相邻的两个数,插入新的数,数的值为相邻的两个数相加减去刚选择的那个数(若下次最小的为新的数,就是删去最小的数,选择相邻的两个数)显然,如果想要最短的话,一堆办公楼的选择得是相邻的,我们把各个相邻的办公楼之间的距离记录到一个数组,题目就转变为求选择K个数,这K个数不相邻的情况下数的总和最小。
2025-03-21 10:32:02
304
原创 AcWing 146.序列
刚开始我写的代码选择的序列是有遗漏的,直接WA,然后我继续对全局进行处理,但是一次求最小插入的节点太多了,直接MLE,最后是看算法书里的解,发现是先对两个序列求前n小的序列,得到的新序列有可以和下一个序列求前n小,以此类推,最后就求到题目要求的序列。
2025-03-18 11:30:36
250
原创 P1435 [IOI 2000] 回文字串
这题是转化为最长公共子序列来做的,把给定的字符串和他翻转之后的字符串进行求最长公共子序列,用原字符串长度减去最长公共子序列长度就是答案。这题我觉得还是值得记录一下的,毕竟一旦涉及到回文我就感觉很沟槽。
2025-02-25 14:02:24
182
原创 P3052 [USACO12MAR] Cows in a Skyscraper G
好久没写博客了,寒假加入校队,高强度刷题,感觉懒得写,寒假前倒是写了一个关于虚拟机共用宿主机的VPN的博客的,结果没过审,只能说对翻墙管的是真严啊。后面寒假了就只顾着爽玩了,没怎么刷题(中途还被我姐拉去写pyhon搞数据,算是增长经验)这道题也可以用状压dp做,但是我还不太会。(题意翻译中的wi改成ci)
2025-02-18 15:27:12
240
原创 #3003. Jed‘s MEX
先把ai大于n的全都转换为刚好小于n的数,记录在cnt[i]中,代表ai有多少个。然后从低往高开始算,如果该数存在,则换下一个数,否则从高处请求数往下降。然后从高往低走,把cnt大于1的分到下面去,使数尽可能分布得广一些。刚开始直接硬来,要么TLE要么WA。
2024-12-03 21:12:18
229
原创 非递归进行二叉树遍历的一种实现(前序、中序、后序)
我就按着印象写了写,把前序和中序搞出来了,就是后序卡了一会。同学问了一下实现这玩意的办法,因为他看不懂老师给的课件。
2024-11-28 19:35:55
173
原创 P1110 [ZJOI2007] 报表统计
不仅MLE,而且因为每次push的时候会把其他id的位置改掉,导致idx数组记录的不准确。本来是想要找一个线段树的题来做的,这题的标签是有线段树,但又感觉和线段树没什么关系。好像这题就是用平衡树来做的,而set的底层结构就是红黑树,平衡树的一种。然后我就用set和multiset来搞定这玩意了。直接MLE了,没想到这东西这么耗内存的。
2024-11-26 18:59:48
131
原创 P1168 中位数
很简单,一个记录比中位数大的数的最小堆,和一个记录比中位数小的最大堆,每次插入一个元素的时候就可以完成快速的中位数转换,看struct的push函数就知道了,非常直观。一道求中位数的题,本来是想再用二分法来试一下的,但是出现了一点问题,先把AC的放出来。
2024-11-25 18:11:17
226
原创 P3273 [SCOI2011] 棘手的操作
该死的,就不应该对栈内元素进行删除操作的,直接往上或往下移还好操作,删掉元素再插入直接裂开,各种“指针”的操作复杂到爆。本来是想改成上移和下移操作的,但是当时改完之后因为其他原因报错了,而我还不知道。而且这题用线段树是更优解,但是也能用左偏树(可并堆)来做,我就拿来练手了。里面就有栈元素的上移和下移(本来栈就应该这么搞的)没打草稿开始做的,脑子一片浆糊,直接0分。又要加一个栈记录最大值,重写代码。刚开始思路就错了,只能拿50分。又debug,拿到80分。心力交瘁,暂时止步于此。
2024-11-25 13:18:19
333
原创 P1552 [APIO2012] 派遣
使用左偏树/可并堆可以解决这个问题,把该子树构建成按薪水比较的最小可并堆,然后不断选取最小的值来计算该子树的最大派遣的忍者数,当该子树的根节点的父节点想要构建最小可并堆的时候,就可以把子树的可并堆和父节点合并,达到增加效率的效果。按照题目的描述,忍者的上下级关系构建成了一颗树,我们可以选择一个结点作为管理人(根节点),然后可以派遣该子树下面的所有结点去做任务。当总薪水超出预算的时候,就删除薪水最大的结点,直到总薪水不超出预算,这个时候派遣忍者数就是该子树最大的(贪心)3. 所有结点的薪水的总和需要被记录。
2024-11-22 12:02:45
369
原创 Z函数(扩展KMP)的模板(参考)
简单来说这玩意就是对一个长度为n的字符串s,计算s的从第i个字符开始的后缀和原字符串s的最长公共子串(i = 1,2,……n),然后拿这个东西来计算别的东西的。二来是为了缓解学习数据分析的苦闷(准确来说是学numpy和pandas),没有可以拿来练手的东西看着真的很困。其实我写这个东西,一来是为了复习一下知识点,看看自己能不能复现Z函数。
2024-11-15 13:59:46
226
原创 Huffman(哈夫曼)编码(贪心)(笔记)
给出n个字符的频率ci,给每个字符赋予一个01编码串,使得任意一个字符的编码不是另一个字符的前缀(这个称为前缀码),而且编码后的总长度(每个字符的频率与编码长度乘积的总和)尽量小。
2024-11-07 15:13:27
626
原创 记录:将时间转化为浮点数的函数
本来是想要用time.h/ctime头文件里面的time_t或者tm数据类型,但是time_t实际上是long类型,而tm数据类型也和浮点数相差甚远,虽然有一些函数可以用,emmmmmm,反正当时我用了一下报错了,当场决定自己写一个函数。实际上是之前用.csv文件里的数据格式是用浮点数记录时间的,但是新的作业里面用户输入的并不是浮点数,后面老师给出了新的.csv文件,但是此时我早已做完了。这里按照的转化标准是我参考time_t的转化标准写的,然后为了让.csv里的数据更合理,年份是减去1900。
2024-10-22 21:18:12
260
原创 P3375 【模板】KMP
事先说一下,我这个代码在洛谷上是0分的,即使我的输出和AC代码一模一样,而且我也不知道洛谷为什么会把我的2读成1的(第一个测试点)在写大作业的功能测试报告的时候看别人的别的项目的报告做参考,看见他用了KMP算法进行字符串匹配,感觉比较有趣,就去学了一下。所以这代码仅供参考(水文)这里没有KMP的思路。
2024-10-10 19:33:15
303
原创 Cubic Eight-Puzzle(UVA-1604)
(第三方网站)AC了!本来以为会TLE的因为当时已经把我能想到的优化方法都加上去了,可是对于深度有30及以上的样例,在我的电脑上运行也是需要差不多一秒的但是上交之后只花了380ms,AC了。
2024-09-19 20:03:19
817
原创 Egyptian Fractions (HARD version)(UVA 12558)
因为后面枚举的分数都不会比1/i大了,且剩下的分数个数为maxd + 1 - d,在最好情况下(就是都等于1/i),剩余分数的总和如果不能比aa/bb大,就没必要继续了,直接剪枝,又因为实际上分数不能相等,所以应该加一个等于号。然后我就按照印象中的思路开始写,结果直接裂了,把循环结束条件按习惯写成剪枝条件,分析了一会,加了个全局变量改改,感觉还是不行,回过头去看源代码才知道自己有多唐。总的来说就是用迭代加深搜索,因为有用到剪枝的方法,实际上是IDA*就加了个限制条件:有k个数字不能用。
2024-09-14 12:40:22
393
原创 Pipeline Scheduling(UVA 690)
这题还是有点折磨的,刚开始我只会递归下一个程序运行的时间(范围在1~n),很明显,直接TLE,然后用C++STL里面的bitset容器来表示所有的程序运行状况(因为最差情况下最长的时间段是200,用longlong只有64位,不够表示),结果vjudge上直接表示Compile Error,应该是不能用。其中,把时间段200缩短到20的方法启发了我,而且里面提到的jump数组也减少的了递归量。按这个思路自己写了一下之后是AC了。
2024-09-12 21:16:42
376
原创 Firetruck (UVA 208)
反正你得按字典序从小到大打印无向图中从起点到终点的起点,所以你所能做的就是用递归来遍历打印,没啥好优化的。其中加上了提前判断能否到达终点的函数(因为算法书中表示不这么做会超时)注意火灾发生在消防站的情况就行了(就是火灾发生地点为1)其中sort函数的使用其实没什么必要,可以删去。一道简单递归题(康复训练)
2024-09-10 15:36:54
234
原创 2181:Jumping Cows
简单来说,题目要求我们求出一个子串,在奇数位的数加,偶数位的数减,求总的最大值。在波峰的时候加,波谷的时候减。(这是我拿去翻译的版本)
2024-09-03 18:08:45
178
原创 1785:Binary Search Heap Construction
(对于一个结点,在结点左边的就是左子堆,右边就是右子堆,当然得是优先级更低的结点才包含进去)其中l和r数组是记录在该位置的左/右边最近的比他大的结点的位置。下半部分直接把结点的关系都给连上去,形成一个树。搞得我现在都不知道怎么改(因为不知道错哪)效率还行吧,时间空间复杂度都是O(n)build的上半部分就是搞这两个数组的。也不知道错哪里,也不给我错误的样例。顺带一提,这题的描述和shit一样。print函数直接打印就完了。
2024-08-10 12:16:26
282
原创 Power Calculus(UVA 1374)
简单来说就是每一次“位移”都是选择两个数进行加法或除法来得到新的数,初始的数组只有1,代表的是x^1。当最大的数乘2^(maxd - d)所得到的数小于n的时候剪枝。加法不是任选两个数,而是尽可能选更大的数。猜想:每次使用新得到的数。用的迭代加深搜索做的。只需要有一个数大于n。
2024-07-23 11:02:19
426
原创 1818:ATP
不难发现对于一个排名为val的人,他可以打赢[val - k, n]排名的人,我们从这里找是否有这样的人,如果有,则放进数组。从mid出发,找一个排名最小(或者说最高的)mid又可以打过的人,然后判mid赢。mid为假设的答案,如果mid可以,则l = mid,否则r = mid。再给每一个人找一个人,让他们能打赢,且在半决赛的时候判这两个人赢就行了。现在数组有两个人,如果总决赛只剩下这两个人,理论上mid就可以胜出。不难得出,找出的这个人,排名要尽可能的小(高),才有利于找到方案。
2024-07-19 17:07:27
306
原创 3872:Library
就是用快速幂加上斐波那契数列通项就行了,虽然f(2)= 2,但是设f(0)= 1就没差了。(斐波纳契数列的通项公式,把A^(n - 1)改成A^(n)就是本题的公式)就是n太大了,最高有十亿,不能用普通的dp来做。这玩意的dp公式应该很明显吧?经验丰富的可能已经知道了。和斐波纳契数列一个样。
2024-07-17 12:56:30
169
原创 1703:发现它,抓住它
测,这题差点让我去世用了一堆方法来做后面现学了并查集,用了并查集来做,因为缩短路径的方法不好,还是超时了后面换了一种缩短路径的方法先上代码。
2024-07-10 17:01:46
530
原创 Zombie‘s Treasure Chest(UVA - 12325)
求出S1和S2的最小公倍数LCM,即当二者的体积相同的时候,若宝物1的价值更大,则宝物2拿的数量不能超过LCM / S2,因为若超过,LCM大小的体积部分完全可以替换为宝物1,且价值更大。反之,可以推出宝物2的价值更大的情况。关键在于减少枚举量,若枚举宝物1的数量,则枚举量为N / S1;枚举宝物2的则是N / S2。这两代码的原理是一样的,就是第二个代码在转化的时候出问题了,害的我改了好久。根据这个原理,就可以写出代码了。
2024-07-09 16:17:35
191
原创 Editing a Book(UVA - 11212)
实际上我的代码还有一些地方可以优化,比如对同一个Node指针用shrink用了很多次,可以改成一次。这题我用迭代加深搜索(iterative deepening)来做的,今天刚学的这玩意,现学现用。顺带一提,虽然说是剪切之后粘贴,但是实际上一次剪切+一次粘贴 = 两个相邻的片段交换位置。我的Node结点把连成串的数字变成一个整体,这样在搜索的时候就不会让原来的链变得更乱了。当Node结点只有一个的时候,说明只有一个串了,答案出来了。因为h一次最大减少3个,所以可以根据这个剪枝。maxd:最大的搜索深度。
2024-07-08 19:37:13
192
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人