- 博客(98)
- 收藏
- 关注
原创 tb的数数问题(牛客小白月赛)
思路:首先好的数一定在A数组里面,之后我们就可以判断哪些数是好数,如果一个数的所有约数都在A里面,那就是一个好数,这个问题我们可以用调和级数暴力来解决,就是当一个数x的约数个数等于其位于A数组中的约数的个数时就是好数。我们用f[i]来代表,数i的约数个数,用h[i]表示数i位于A数组中的约数个数。
2024-09-22 23:03:39 264
原创 E. Cosmic Rays
对于每次新加入的对数,如果与上次的对数的b相同那么就加一次即可,然后往前遍历,如果遇到权值不同的,长度比他长,那么就删除,他没有必要存在,如果比他短,就循环结束,把当前对数加到前缀里面。思路:我们使用前缀处理的方法进行简化计算,减少时间复杂度,也就是把不必要存在的对数删除,那我们需要删除哪些?对于新加入的对数,如果与上次的b不同,那么就直接往前遍历,接下来同上。那么为什么有的对数没必要存在,需要大家想一想。
2024-08-14 21:26:48 307
原创 2024睿抗国赛赛后总结
第三题,一开始忘了如何dfs求排列,求完排列果断暴力,最后就14分,当时想的是dp,没想到就是一个简单数学问题。每个数可以拆个十百千来算,就是个排序。第二题就开始犯迷糊了,题面太恶心了,val数组少写了一个半天没找到,无语了。第四题,当时写最短路,然后写的很对就是过不去,最后没办法,只能二分答案,这次比赛很糟糕,但是也学到了不少东西。赛后秒出正解,服了啊,错误原因是我建边建错了。题目可以去pta教育超市找。
2024-08-04 22:05:58 317
原创 学到了一种新的技巧
4、这种集成的技巧,根据相同点把不同类的代码组合成一个函数,这种技巧是需要学习的。2、通过return两个不同类型的答案,使得代码量变得更少。1、通过erase删除方向,让原本很复杂的代码变得简洁。3、通过bfs将状态转移给后面。
2024-07-29 22:39:14 250
原创 配置sublime的中的C++编译器(.sublime-build),实现C++20
GCC 4.8: 支持 C++11 (部分)GCC 4.9: 支持 C++11 和 C++14 (部分)GCC 5: 完全支持 C++14GCC 6: 支持 C++14 和 C++17 (部分)GCC 7: 支持 C++17 (大部分)GCC 8: 完全支持 C++17,部分支持 C++20GCC 9: 支持更多的 C++20 特性GCC 10: 支持大部分 C++20 特性GCC 11: 更全面地支持 C++20GCC 12: 支持几乎所有的 C++20 特性。
2024-07-24 14:16:53 656
原创 牛客周赛52总结
思路:这里有个结论,只要左右括号相等,通过循环移位一定可以成为合法的字符串序列,所以这道题就变成一道组合数学的题了。思路:使用优先队列进行多路归并。
2024-07-22 19:38:07 266
原创 牛客周赛51
思路:二分答案,然后,判断当前二分的值符不符合,如果可以走到(n,n)就缩小答案,否则扩大答案。思路:求a mod 上b后的值为amodb, 求gcd(b, amodb)即可。
2024-07-14 21:11:38 252
原创 C. Turtle and an Incomplete Sequence
如果a[l] > a[r],那么就处理a[l + 1],让左边的数变小,否则处理a[r - 1]。首先处理首尾的连续-1串,这个也很好处理,最后我们处理两个非-1之间的-1串。思路:首先如果都是-1的话,我们可以输出1 2循环,否则。
2024-06-01 00:46:17 233
原创 C - Job Interview
工作1溢出了,若没来的那个人在工作1前n个位置,答案是工作1前n+1个人做工作1+其他人做工作2-没来的那个人做工作1;工作2因为没有溢出,不管没来的那个人是谁,工作2的人还是做工作2,不受影响。其他情况答案是前n个人做工作1+其他人做工作2-没来的那个人做工作2。了上限,记作工作1;且另一种工作的人数没有溢出,记作工作2。先不考虑溢出,将n+m+1按照分配的工作分类。会发现,有且仅有一种工作的人数是溢出的,即。
2024-06-01 00:31:24 430
原创 线段(线性dp)
从上一行右端点转移同理。边界f[1][0]=r[1]+r[1]-l[1]-1,f[1][1]=r[1]-1,然后直接搞就行了,时间复杂度O(n)。那么转移就很简单了,走完当前行且停到左端点,那么一定是从右端点过来的,那么从上一行左端点转移的话就是。f[i][0]=abs(上一行左端点的坐标-本行右端点的坐标+本行线段长度)f[i][0]表示走完第i行且停在第i行的左端点最少用的步数。f[i][1]同理,停在右端点的最少步数。
2024-05-23 20:53:42 431
原创 E - Yet Another Sigma Problem(ABC字典树)
我们可以发现两个字符串的最长公共前缀就是字典树中的最近公共祖先。然而这道题,比如说某个结点是x个字符串的前缀,那么当前结点对答案的贡献为x * (x - 1) / 2,就是x中任选两个字符串组合,因为在这之前,这些字符串的前缀在计算其他结点的时候已经被算过了。
2024-05-12 01:07:08 349
原创 D - Another Sigma Problem(ABC)
我们可以处理一个后缀来记录当前数a[i]需要乘上多少(类似于1110这样的),然后对于当前位来说,对答案的贡献还要加上(i - 1) * a[i],因为a[i]还要做前(i - 1)个数的后缀。
2024-05-12 00:55:19 322
原创 牛客小白月赛93
思路:我们可以想出,如果站在[mid+1,r]中,那么是当前位为奇数,在[l,mid]为偶数,那么我们可以正着操作输入的x,如果但前x大于mid,那么答案当前位位1,否则为0.思路:我们可以算出总共的方案为m * m * m,然后三个图相同的方案为m,三个图都不相同的方案为m * (m - 1) * (m - 2)。然后按照要求求即可。思路:我们可以知道,a*b% mod = (a%mod) * (b%mod)
2024-05-10 22:33:28 356
原创 F. Equal XOR Segments(异或前缀和+二分)
所以我们需要找到一个位置满足 𝑠𝑥⊕𝑠𝑙−1=𝑘 ,然后我们需要在𝑥后面找到一个位置满足 𝑠𝑦⊕𝑠𝑙−1=0.如果整段异或和为0,随便分成两部分都是正确的.否则我们至少需要分成3段,设整段异或和为 𝑘.可以把数字分桶存储然后二分找到符合要求的位置.首先可以预处理前缀和𝑠快速计算区间异或.
2024-05-04 00:00:38 246
原创 C、Minimizing the Sum(线性dp)
用dp[i][j] 来表示前i个数操作了j次的最小和,然后对于每个a[i],我们分别枚举i前面操作了x次以及后面操作了j次,对于每次操作,都是将一段区间全换位区间最小值.
2024-04-30 12:49:22 515
原创 D - Grid and Magnet
思路:标记一下磁铁周围的空地即可,每个连通块一定可以互相到达,我们dfs算出联通块的大小再加上该连通块周围的可达磁场区域即可。
2024-04-27 22:07:28 314
原创 智乃的k线段区间
在数轴上有N条线段,第i条线段的左右端点分别为liri。定义一段区间LR包含第i条线段,当且仅当L≤li≤ri≤R。智乃想要知道LR∈1M且L≤R时,有多少个区间LR包含至少K条线段。第一行输入三个正整数NMK1≤K≤N≤1051≤M≤109。接下来N行,每行输入两个正整数liri1≤li≤ri≤M。仅一行一个非负整数,表示问题的答案。
2024-04-27 00:05:03 724 1
原创 371D - Vessels
思路:用并查集维护,如果当前容器没有满,就指向自己,否则指向下一个容器。这样就可以快速 find 到下一个没有满的容器,从而模拟询问 1。
2024-04-23 22:40:23 187
原创 2024天梯赛赛后总结
这个题当时读错题了,以为在空地相遇也会死亡,结果只有在大本营相遇才会死亡。这道题忘记set还有count函数,直接用二分来做有一个样例超时。这个题忽略了每个字符串第一个字符可能是空格。L1-101 别再来这么多猫娘了!L2-049 鱼与熊掌。L3-037 夺宝大赛。代码:从大本营跑bfs。L2-050 懂蛇语。
2024-04-21 14:14:26 264
原创 L2-2 巴音布鲁克永远的土(二分+并查集)
对于判断答案合理,可以用并查集,看mid能否把所有检查点连进一个集合中,枚举每个结点,如何当前结点周围的四个方向可以连的话,就加进同一个集合,最后判断所有检查点是否是同一个祖先即可。思路:我们可以二分答案,然后判断当前答案合不合理。
2024-04-11 22:01:29 175
原创 缝合的作品(并查集/逆序)
对于操作1:把a单词换为单词b,就相当于a、b两个集合结合。然后再给a单词赋一个新的id,用来进行操作2,因为之后的操作2可能会出现a这个单词,并且没有转化为b单词,就需要一个新的id。、思路:首先是并查集来做,首先给给每个单词一个id,然后把它放到ans[i]处。操作2:因为当前操作排在后面,当前面无论做什么改变当前位置单词也不会改变。对于操作2:就是改变一下答案中目标位置的单词即可。逆序的话,就是倒着从最晚操作的来改变文章。操作1:就是简单的把单词a改为单词b。
2024-04-11 21:21:09 225
原创 解压文本(dfs+判环)
不难发现文件可以解压,当且仅当 1 号点出发能到达的节点集合,是一个有向无环图(DAG)。递归解压它引用到的文本,如果中途发现引用的节点。无法解压的情况,就是图里存在环。用于存储已经解压的内容,一旦发现其长度超过。说明出现了环(本质上同,无向图找环)。解压到这个文本时,给其标记。则直接返回,否则最后输出。
2024-04-11 20:59:36 138
原创 最短路-虚拟节点
思路:我们可以开虚拟节点来连接两个结点权值二进制1的个数相同的两个结点,由于1e9内1的个数不超过30,所以开30个虚拟节点,第i个结点连向二进制1的个数为i的点,然后跑dij即可。
2024-03-24 23:11:08 184
原创 牛客周赛38
思路:我们想,就是如果有三个数可以表示为xyx,这样的回文,那么就符合题意,也就是说如果这个区间中存在两个相同的数并且不相邻那么就yes,或者是三个相同的数yes,否则no。处理区间的时候,我们判断区间右端点即可,我们预处理出i位置的左边离i最近的可以满足题意的位置。也就是寻找上一个a[i]的位置。思路:枚举公比,然后每个数充当数列首项,然后往数组中找即可,公比最大不超过1000,公比可能为1。
2024-03-24 21:36:31 202 1
原创 F. Timofey and Black-White Tree
所以我们没加入一个黑点,那么就用这个黑点来更新一下所有点到其距离。然后新加入的黑点,dis里面存着这个黑点到之前加入的黑点的距离的最小值,和之前的最小距离取一个min即可。思路比较绕,可以结合代码理解。我们想象一下,如果只有两个黑点,那么答案就是两个黑的的距离,假设为ans,如果有三个黑点,而且新黑点到两个黑点的距离为d1,d2,那么答案就是min(ans,d1,d2)。思路:最短路+bfs。
2024-03-16 18:54:37 378
原创 C. Tree Infection
我们可以结点按照兄弟的数量排序,然后优先感染兄弟多的结点.这样我们就知道了,第一秒被。个兄弟,所以我们扫描一遍就可以知道还剩下多少个兄弟结点还没被感染,判断能否用剩下的。思路:先处理出每个结点有多少个子节点,然后存到数组中,然后用二分时间。一定用于优先感染兄弟结点比较多的结点,这样可以充分利用。的操作将这些结点感染即可.的结点剩下的时间里可以被。个兄弟,第二秒可以被。
2024-03-16 14:52:08 394
原创 F. Chat Screenshots
思路:拓扑排序,如果存在满足所有截图的顺序,那么这个图中就会存在拓扑排序,这意味着图中不会存在循环。因此,我们的目标就是检查图的非循环性。
2024-03-16 12:22:52 416
原创 B. Array Fix
思路:我们倒着看,首先判断以下当前元素有没有被操作过,被操作过的话,那么需要改为操作后的数,然后跟当前数的前一个数进行比较,如果a[i] < a[i - 1]的话,那么需要将a[i - 1]拆分,然后再判断即可。
2024-03-16 00:48:16 495
原创 贪心/树形dp
因为如果红色节点的子树中如果有红色节点的话,那么该子树对其不会造成影响,不用考虑,因此我们在考虑每个红色节点时,不考虑其红色子树。那么如图,对每个红色节点答案有贡献的就是其所有非红色子节点的权值和。我们用dfs处理出每个红点的非红节点子树,然后枚举每个红色节点,然后在枚举该红色节点包括的所有结点中1的个数,保证1的个数不会超过2个,其他的结点权值为2.
2024-02-23 21:33:20 423 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人