- 博客(37)
- 收藏
- 关注
原创 A - Environment-Friendly Travel(二维dijkstra)
写法就和dijkstra模板差不多了。的排放、路程的长度已经当前节点。则重载一个结构体放进去,维护。二维dijkstra,代表从起点出发,经过。
2024-03-27 15:34:59 441
原创 补题集合2
没想到这是一个签到题,因为数据量小,状态并不多,所以可以使用bfs去跑每一个状态。令mod是余数,sum是累加和,那么状态最多就只有500∗5000种状态。可以bfs。但是要注意的地方是,bfs在标记是否遍历过时,应在入队的时候就进行标记,而不是在出队的时候再进行标记,不然会重复入队造成MLE或者TLE。这个题实属没想到可以这样暴力写。
2024-03-27 15:08:18 792
原创 补题集合1(num.15)
酒馆有 n 个人,每个人都有一个固定的进入和离开的时间,然后你会去酒馆交朋友,只要遇到就会成为朋友,即使是在门口相遇,然后你最多只会待 m 个时间,求出最多能交多少朋友。模拟,将每个人进入和离开的时间分开存储后进行排序,然后遍历模拟一遍,记录过程中的最大人数。对于一个排好序的字符串,经过多次交换两个字母,能排列成给定字符串。但是当只有 ai 大于 bi 时才允许交换,如果反向思维去想的话,我们可以把给定的字符串,通过多次交换两个字母的位置来变成排好序的字符串,再把交换的顺序逆向输出即可。
2024-03-11 16:31:32 860
原创 ST表一些练习题答案
我们只需要让s1 = s,t1 = t,交换 s1 和 t1 的值,然后再去计算 mxh,mxs,mxt 就可以了。更具体点就是,s 和 t 的位置并不会影响式子的正确性,但是由于我们维护的这些区间值,是从前向后顺次维护的,而由于 s大于 t,会导致我们不能正确求出 mxh,mxs,mxt 的值,所以只需要交换一下区间范围就行了。这个题感觉挺难,而且难点不在ST表上,更多的是思维上的推导,可以以后基础算法学的差不多了再来做,题目描述感觉不是很清楚,可以去洛谷题解里面看一下他们画的图,就应该能明白题意了。
2024-01-27 11:26:54 900
原创 Codeforces Round 896 (Div. 2)_D1. Candy Party (Easy Version)
也就是说,我们需要得到 2^x 个糖果,然后再给出 2^y 个糖果,对于所有的人,只要得到糖果的方案数,和给出糖果的方案数相同,也就是 “ 收值平衡 ”, 那么就是可以的,我们并不需要考虑中间交换的过程。因为操作的糖果数都是2的次方,当一个较大的2的次方减去一个较小的2的次方,得到的二进制里面的 1 必定是连续的,即差值转化为二进制后,二进制中的 1 是连续的, 不连续就是不可行的。其次,如果一个人的糖果数等于这个平均值,是不影响结果的,也就是说,有没有这个人都一样,完全可以忽略掉。
2023-11-15 21:06:54 61
原创 F - Kobolds and Catacombs(思维-前缀和)
将一组数字,划分成连续的若干个集合,将这些集合,内部排完序之后,使整个队列不会降序,求最多能划分成几个集合。通俗来讲就是:求一遍前缀和之后sort,然后再求一遍前缀和,比较一遍大小就行了,大小相等,cnt ++。
2023-10-01 15:12:52 91
原创 A Secret (KMP)
比如aba这个字符串,a匹配成功答案加1,接着b匹配成功答案加2,加的是字符串的目前已经匹配长度(即它的权值)。,因此我们要加上那个它前缀的总权值,即 1*1 + 2*1 + 3*1 + ... + j*1(都只出现了一次,所以乘1,相当于没乘),这个值其实就是 j * ( j + 1 ) / 2。为了让它能一直不断匹配直到主串结束,所以在翻转后,俩字符串末尾加上一个不相同的字符,来不断让子串最后一个添加的字符匹配失败,做到一直和主串匹配下去。设字符串二的长度是 len2,目前已经匹配成功的长度是 j;
2023-09-22 21:07:53 67
原创 Monarchy in Vertigo(dfs序+队列)
显而易见,每个国王死后是不可能再生孩子的,所以这个题目的答案就是一个dfs序,只需要将整个dfs序用队列存储下来,然后每次国王去世就标记一下,去判断队头这个国王有没有被标记,被标记了就一直pop,直到没被标记就输出。
2023-09-14 15:52:42 69
原创 2022 ICPC Southeastern Europe Regional Contest H-Hanoi
H-Hanoi。我们先将一个柱子上的数字尽可能往第三根柱子上放,然后放到不能再放了。再将第一个柱子上的数字尽可能放到第二根柱子上,放到不能再放了。然后再将第二个柱子和第三个柱子上的所有数字从小到大往第一根柱子上放。一直循环这个操作,直到第一根柱子在往第三根柱子上放数字时能全部放上去,跳出循环。第一行输入n,第二行输入n个数,是第一根柱子上的数字从底向上的顺序。第一根柱子上的排序,没有要求,但是另外两根柱子必须是大的在下面,小的在上面。然后让你通过一系列操作后,把所有的数字都移动到第三根柱子上
2023-09-08 17:05:59 288
原创 D - Deceptive Directions (VJ)(BFS)
给定的字符串,每个方向都是错误的,所以从起点开始去走其他三个方向。并且题目给出,字符串是最短路线,所以在bfs查找答案之前,先bfs一遍所有点离出发点的距离。所以不断朝着另外三个方向遍历,并且最后距离与字符串的长度相等即可。给定一个起点,去找到所有宝藏可能存在的位置。
2023-09-05 10:53:34 103
原创 C. Strong Password(Educational Codeforces Round 151 (Rated for Div. 2))(贪心 + find函数)
然后在查找过程中我们只需要用 find(c,z) 不断查找即可。(从下标 z 开始查找字符 c)。查找的过程中保存上一位字符所在的最大下标。只要有找不到的字符即可 break 输出 YES,都能找到的话就是 NO。比如:s = 121332,l = 121,r = 131;第一个字符只能选 1,但是第二个字符我们在2和3之间选择更靠后的3,这样可以使后面的序列更短,更不容易匹配成功。我们对每一位 li ~ ri 的数选择对应下标越大,后面剩的序列越少,就越不容易匹配成功。
2023-08-31 17:22:54 199
原创 H - Rational Ratio(VJ)(结论题)
0.456(56循环) = 56 *(4 * 99) / 99,然后再除以10,约分即可 ———(写成4.56,然后结果除以10)把不循环的部分存成一个数,循环的部分存成一个数,然后约分即可。0.56(56循环) = 56 / 99;0.6(6循环)= 6 / 9;
2023-08-30 19:59:27 72 1
原创 Lunch (Nim游戏)2020中国大学生程序设计竞赛(CCPC) - 网络选拔赛
对于每个数 x 的SG值是[x==偶数] + 质因子个数(不包括因子2的数量)。由于 x 上限为1e9,所以可以先预处理sqrt(1e9) 以内的质素数,然后唯一分解得出答案。
2023-08-15 09:12:42 83
原创 A - Amanda Lounges(染色法)
然后对于第一种图,我们只需要从任意一个点开始遍历,判断与它相连的点是否颜色相同,颜色相同就impossible,否则就染成不同的色,这种图的服务区个数是颜色color1的数量。然后将这个图分成两种情况,一种是图中已经有一些点被染色了,另一种是整个图上没有被染过一次色。第一行输入n,m,代表有n个飞机场和m个要求。然后m行,每行三个数,分别是i,j,k。如果两个服务区,那么就给两个机场都染色成color1,如果是零的话,就都染成color2。所以,我们从被染了色的点开始遍历它能所到达的所有点,组成一种图。
2023-08-14 16:03:09 53
原创 G - Outing (tarjan + 分组背包)
我们首先要找出每一个集合最小的情况。因为它的出度只能是 1,所以不可能形成两个环相交的情况,只能是在形成一个环后,又会有一些零散的点连在这个环上。于是,我们可以求出这个最小环作为选择这个集合就必须要加的最小值,然后再通过并查集求出这个集合可以加的最大值。对于这一个个的集合求出满足客车容量的最大加和(分组背包)。我们把它一步步来做,因为有人数限制,然后我们又能将人群分成一个又一个的集合,所以可以想到背包问题。这个题比较容易想到的是求最小环,还有就是并查集。因此我们要先去求最小环,用tarjan。
2023-08-12 14:40:11 84
原创 H - Fishing Master (炖鱼)(贪心+思维)
不能在每条鱼烹饪结束前钓上来的鱼数量就是 n - cnt - 1(第一条鱼必须先钓,不能在烹饪过程中进行,所以先减去)。我们将不能在烹饪结束前就钓上来的鱼,分别安排在这些烹饪时间余数最大的地方,这样重叠时间越多,多出来的时间就会越少。T组输入, 每组输入第一行 n, k 分别是鱼的个数,和钓鱼的所用时间。可以在炖鱼的时候去钓鱼,也可以在钓鱼的时候去炖鱼,但是不能在钓鱼的过程中回去重新炖其他鱼。总时间 = 烹饪总时间 + 钓鱼多出来的时间(烹饪完了,鱼没钓完,多出来的时间)。
2023-08-12 10:51:41 93 1
原创 H - Clock Pictures (kmp)
sort之后,把相邻的刻度差存起来,然后两个进行比较即可。因为最初位置的不同,所以将第一个刻度差在数组末尾再重新复制一遍。如果第二个表的刻度差数组能在第一个数组里面找到连续的子串,那么就可以。(查找方式:kmp)两个钟表,第一行n,后面两行每行n个数,代表n个指针位置。只要通过旋转能使其重叠,那么就possible,否则impossible。个人认为是 csdn 里最清晰没废话的一篇文章,干货满满。推荐文章:kmp算法。
2023-08-10 20:28:18 79 1
原创 D. Fast and Fat(2023 ICPC 山东省赛)(二分+贪心检查)
对于一个运动员 i ,他的速度是 vi,体重是 wi。如果运动员 j 的体重 wj <= wi,那么运动员 i 可以用原本的速度 vi 背着运动员 j 奔跑。如果 wj > wi,那么速度就变成了 vi - ( wi - wj ) (如果是负数,那么运动员 i 不能背着 j 奔跑)。每组数据第一行输入一个n,代表这个团队有n个人,后面n行,每行两个数vi,wi。在二分答案时,对于答案 x ,选出大于等于速度 x 的人当中 vi+wi 最高的几个人,分别去背着速度小于 x 的人当中 wi 最大的人奔跑。
2023-08-10 15:35:56 874 1
原创 P1434 [SHOI2002] 滑雪(洛谷)(记忆化搜索)
记忆化搜索:举个简单的例子,对于样例上的高度2,dfs后,得出能滑行长度最大是2,然后在高度3滑行,又会搜到高度2,就直接返回2,不会继续搜2又能到达哪些点了。简单来说,就是某个结果确定后就将它储存,再次遍历到就直接返回它的结果。一开始bfs暴力,90分,第三个点tle。普通dfs又肯定会超时。
2023-08-10 08:19:38 72 1
原创 U161182 可达性统计(洛谷)(拓扑排序+bitset)
我们可以发现,父节点能经过的点,是它所有子节点能经过的点的并集。所以我们先统计子节点能经过的点,然后再根据子节点的并集得出父节点能经过的点个数。因为题目保证没有环出现。于是,我们就可以先拓扑排序,将得到的序列从后向前遍历。那么就一定是先算的子节点,然后才能算到父节点。数据范围 1
2023-08-09 17:01:09 134 1
原创 D - 38 parrots (VJ)(线段树_维护最大公因数)
'+' 后面跟一个数字 t 是,队伍中进来一个长度为 t 的动物,“-”减号是在队头的动物走掉了,“?” 是询问整个队伍中是否存在一个动物能用它的长度去测量其他动物的长度,如果有输出Y和它的长度,否则输出N。如果一个动物能测量队伍中所有动物的长度,那么这个动物的长度一定是所有动物长度的因数。即:队伍中所有动物长度的最大公因数是这个动物长度的倍数(包括相等),那么这个动物就能用来测量。每个父节点是它两个子节点的最大公因数。如果动物a的长度是动物b长度的倍数,那么动物b就能测量动物a的长度(相等也可以测量)。
2023-08-03 21:22:28 109
原创 I - Barbecue (字符串哈希)
先判定是否为回文串,如果是Budada就赢了。如果不是,判断字符串长度,长度是偶数,Budada赢,是奇数的话Putata赢。可以用哈希或者manachar,下面是哈希代码。第一行是长度n, 询问次数m。第二行是长度为n的字符串。后面m行是询问,每行两个数l和r,从l到r的序列中进行抽字符串。规则:如果一个人在抽之前,或者抽完之后,字符串是个回文,他自己就输了。
2023-08-03 10:28:16 129
原创 C - Association for Control Over Minds(VJ)(并查集 + vector去重)
先是在输入过程中不断用并查集的find()函数,将拿个成分的祖宗节点加到vector数组中,然后sort排序并去重(具体操作看代码)。然后将去重后的vector的数,找到对应集合的个数,相加等于m,就代表可以,答案数加一。简单来说就是,你要做不同种类的药水。然后第一行输入n,代表你将要去做n种药水,下面每行第一个数是m,后面接着是m个数,代表你要做这种药水所需要的成分有这m种。第一种、第二种可以做,第三种就不能,因为第一种成分用完了,但是第四种可以,把第一种和第三种药水混合,然后加入第五种成分即可。
2023-08-01 19:56:25 53 1
原创 2018黑龙江省赛G - Flower (VJ)(49米大剪刀修剪花)
但是,我们在输入完后,先sort一下(假设最高的高度是mx,最矮的是mi),然后第一个最矮,留着不动,其余n-1盆都减去mx-mi。修剪完之后我们发现,第一盆,和最高的那一盆一样高了,第二盆变成了最矮的。简单来说就是,小明有个49米的大剪刀,还有n盆花,然后需要对它们进行修剪,最后让它们高度相等。因为我们要用最小的次数把它们剪成一样高,所以首先想到,每次挑选出最矮的一盆留着不剪,其余n-1盆进行修剪,剪去的高度是最高的和最矮的高度差。先输入一个T,代表有几组数据。比如,4个花,分别高度是5,8,9,10;
2023-07-31 20:15:25 63
原创 B - Balanced Diet (VJ)(糖果_vector_贪心)
输入:T组数据,每组数据第一行输入n, m;代表一共有n个糖果,一共m种。第二行输入m个数a[i](a[i] 是指,对于编号为 i 的糖果,如果拿了这种糖果,那么就必须至少拿a[i])(编号是从1 - n)。后面n行数据,每行两个数,第一个数是糖果甜度,第二个数是糖果编号。输出:对于他拿的所有糖果,将其甜度值加和得到sum。在他拿的所有糖果中,数量最多的那种糖果数量为 x, 求sum/x 的最大值;比如拿了两种糖果,一种糖果拿了五个,另二种拿了两个,那么这个值就是sum/5。
2023-07-29 15:52:01 82
原创 G - Goblin Garden Guards (VJ)(水浇哥布林)
思路:我们发现,半径 r 非常的小,坐标也不算太大,而且都不为负数。所以直接巧妙的暴力。一开始开个二维数组把哥布林存一下,然后把每个圆的最小外切正方形的每个点都遍历一遍,只有点到圆心的距离小于半径,就加入答案ans,然后将这个点数量置为 0。题意:有一堆哥布林,它们怕水。先给你n个哥布林坐标,又给你m个喷水池的坐标和半径。被水淋到哥布林就会很难受然后回家。问你有多少哥布林还留在原地(没被淋到)最后,cout(n - ans)
2023-07-29 09:35:10 108
原创 E - Entertainment Box (VJ)(multiset)
题意:n个录音, k个录音机,每个录音都有规定的开始和结束时间,只有在这个录音结束后才能放下一个录音(结束时间和下一个的开始时间可相同),求这k个录音机最多能放几个完整的录音。思路:multiset,有几个录音机就先垫几个零(初始化),然后录音按照结束时间从小到大排序,遍历,具体做法看代码注释。
2023-07-29 09:04:17 113
原创 M - BpbBppbpBB (VJ)(B与b的数量统计)
思路:仔细思考,可发现,B中间有两个大白格, 小b只有一个,而且B的黑格数量与小b的不同。2 * x + y = 大白格的总数,B的小黑格 * x + b的小黑格 * y = 小黑格的总数;题意:给一个图的大小,给你一个图,求图中 B 和 b 的数量。
2023-07-29 08:28:40 267
原创 P1253 扶苏的问题(洛谷)(线段树)
tag值存两个,一个覆盖值,一个累加值,再开一个变量存是否有覆盖值。因为覆盖值可能为零,也可以置为一个极小的值作为覆盖值是否存在的判断条件(如-1e18),除了注释的部分要注意一下以外,其余纯模板。
2023-07-28 20:48:18 302 1
原创 K - City (VJ)(并查集+离线查询)
在询问里面遍历,只要大于等于这个询问值(注意不要越界),就不断添加答案(并查集)思路:按照w,从大到小排序。询问也进行从大到小排序,最后再按照原来顺序输出。
2023-07-27 21:22:28 60 1
原创 P1438 无聊的数列(洛谷)(线段树_等差数列)
因为加的数是等差数列,等差数列相加依旧是等差数列。而线段树存储的特点又是一个又一个的区间,所以可以在加一个等差数列的同时,用 tag 分别记录当前区间对应的首项和公差。
2023-07-27 19:36:51 95 1
原创 P3870 [TJOI2009] 开关(洛谷)(线段树_区间开关灯)
不需要想太复杂,只是一个线段树板子题。tree[] 数组用来记录当前区间内开着灯的数量;每操作一次后的亮灯数量,就是区间总数减去原来开着灯的数量。
2023-07-26 17:26:00 84 1
原创 P2865 [USACO06NOV] Roadblocks G(洛谷)(次短路)
开一个二维数组 dis[N][2] 分别记录最短路和次短路即可。dijstra和spfa均可,推荐spfa。
2023-07-19 11:05:05 74
原创 P4568 [JLOI2011] 飞行路线(洛谷)(dijkstra优化+动规)
该航空公司一共在 n 个城市设有业务,设这些城市分别标记为 0 到 n−1,一共有 m 种航线,每种航线连接两个城市,并且航线有一定的价格。核心:假设 i 代表当前节点,j 是免费次数,i - 1 是指当前节点的上一个节点(父节点),w是这两个节点间的价格,dis是到达i节点,用了j次的免费次数所用的最小价格。接下来 m 行,每行三个整数 a,b,c,表示存在一种航线,能从城市 a 到达城市 b,或从城市 b 到达城市 a,价格为 c。第一行三个整数 n,m,k,分别表示城市数,航线数和免费乘坐次数。
2023-07-12 11:32:27 184 1
原创 B - Bracket Sequence(VJ)(计算括号表达式_栈)
左括号和数字直接入栈,遇到右括号,就算数、清理栈、结果入栈,直到遇到左括号。在这个过程中记录着括号有几重进行相应运算。最后,再将栈中剩余元素相加即可。题意:首先明确,没括号时是加号,每加一重括号之后,+变*或者是*就会变+;
2023-06-24 19:51:03 64
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人