- 博客(186)
- 收藏
- 关注
原创 2024.7.20 暑期训练记录(6)
CF1391D - 505(思维+状压dp)首先简化问题,发现一个矩阵如果要满足条件,那它其中的每一个 2×22\times 22×2 的小矩阵都要满足条件,于是很容易发现 4×44\times44×4 的矩阵是一定不满足条件的(因为是由四个 2×22\times22×2 的矩阵拼起来的,所以里面的 111 一定是偶数个),既然如此,更大的矩阵就更不行了,因为里面肯定会包含 4×44\times44×4 的矩阵,所以就把问题简化到 n≤3n\le3n≤3 的情况了n=1n=1n=1 时,没有边长为偶
2024-07-20 14:30:35
1159
原创 【牛客】2024暑期牛客多校2 补题记录
这一段合并的最大贡献,很容易想到这一段贡献是可以由区间内的贡献更新的,所以我们先计算长度小的区间再计算长度大的区间。一个特殊的区间dp,可以作为trick积累一下。,再看有没有在这一步之前合并过的小区间,,为了方便统计答案,可以将数组两段填。,可以先将区间内每个元素的贡献看做。
2024-07-19 23:22:01
629
原创 2024.7.13 暑期训练记录(5)
1399E1 - Weights Division (easy version) (dfs+堆 *2000)对于一条边的贡献,很容易知道是边权乘使用次数,使用次数就是这条边下面的叶子结点的个数,这个我们用dfs就可以处理出来了然后用堆,但是这里有一个易错点!堆里的排序规则应该是,(w−w2)×cnt(w-\frac{w}{2})\times cnt(w−2w)×cnt 大的放前面,这个才是操作一次消除的总值,不能把 w×cntw\times cntw×cnt 放前面,因为除法下取整会出问题12
2024-07-14 11:28:54
625
原创 2024.7.11 暑期训练记录(3)
383C - Propagating tree首先想到需要区间修改单点查询,所以用线段树要在线段树上处理一棵树,又想到将树转化成dfs序处理这是没想到的地方:因为对于层数是奇数还是偶数,处理方式不同,所以建两颗线段树分别处理奇偶算法网络流二分图匹配的两道例题,和无源汇上下界可行流的例题打算把acwing的课看完之后,先把还没有完成的网络流24题刷完,然后随缘看看区域赛啥的了
2024-07-12 11:56:09
391
原创 2024.7.2 - 7.8 暑期训练记录(1)
因为其中可能会有集训队暑期训练赛的题,所以这几天的训练记录统一在训练赛结束后发出每一题不再像之前一样写题解,只会写自己在这一题里的收获。
2024-07-10 08:39:22
532
原创 【cf】EPIC Institute of Technology Round Summer 2024(Div. 1 + Div. 2)题解 C - D
发现最后一个变为 0 的一定是第一个,对于每一个位置而言,如果它后面的位置没变为 0 ,那么它就不可能变为 0,所以它变为 0 的时刻最小应该是在它后一个位置变为 0 的时刻加 1,如果这个位置太高的话,就需要。表示 Bob 在前 i 种数里选完了 j 种(注意是种不是个)的时候需要进行的操作次数。,因为要保证 Alice 的操作次数比 Bob 多,在满足该条件的基础下,个时间变为 0,所以当前位置变为 0 的时刻就是二者取最大值。如果要取第 i + 1 种,首先需要满足一个条件,即。
2024-07-01 09:57:07
832
原创 【牛客】牛客小白月赛97 题解 A - E
数量最少的情况就是把负数全都排在正数前面,且正数从小到大排列,这种情况怎么计算呢,因为 b 的值域最大只有100,所以用。对 x 开方,得到的就是能存在数组里的所有数的个数,我们要取 n 个,也就是 C(sqrt(x), n)首先需要注意到 c 的值和 b 一点关系都没有,因为 b 不可能对 (p - 1) 有任何贡献。表示前 i 个元素中 j 出现的次数,之后计算最多需要多少个正数可以把负数都抵消即可。a 的前缀最大值数量最多的情况就是把正数全都排在前面的时候,此时数量为。答案就是最大值-最小值+1。
2024-06-30 09:55:07
293
原创 【cf】Edu Codeforces Round 167(Div.2)题解 A - E
如果直接这么求也不对,因为我们发现两个相同的颜色组成的一段,处在中间位置时,和两个不同的颜色组成的两段贡献一样,举个例子:1221和1231得到的 b 数组都是 1111,但是这样的相同两个颜色组成的一段处在两段时,贡献就和不同颜色组成的两段不一样,举个例子:112和312得到的 b 数组分别是 211 和 111,所以每次需要减去不处在两端的 由两个相同颜色组成的一段。首先需要考虑到,每次锻造会让我们的原料减少,那我们选择锻造方式的时候,一定会在原料数量满足条件的情况下,选择原料减少数量最小的。
2024-06-28 14:18:34
884
原创 【数据结构】带修莫队
中我们探讨了莫队的基础应用,但我们知道,莫队是个离线算法,需要读入所有询问才能进行处理,那如果遇到在线修改、但不需要在线输出的问题,我们有没有办法用莫队解决呢?,普通的莫队我们只记录下当前的左右端点,和当前询问的左右端点进行比较,对于带修改的问题,我们只需要多记录一个时间戳。
2024-05-23 13:03:55
382
原创 2024.5.20-5.26 训练记录(30)
文章目录CF 1325D Ehab the Xorcist(*1700 思维)CF 1516C Baby Ehab Partitions Again(*1700 01背包+思维)CF 486C Palindrome Transformation(*1700 思维)CF 1368D AND, OR and square sum(*1700 位运算+思维)CF 1628B Peculiar Movie Preferences(*1700 思维)CF 1479A Searching Local Minimum(*
2024-05-21 21:37:12
854
原创 2023年河南省大学生程序设计竞赛题解
文章目录Problem A. 小水獭游河南(暴力)Problem B. Art for Rest(前缀和)Problem C. Toxel 与随机数生成器(暴力)Problem E. 矩阵游戏(dp+滚动数组)Problem F. Art for Last(单调队列)Problem G. Toxel 与字符画(大模拟)Problem H. Travel Begins(贪心)Problem K. 排列与质数(思维)Problem A. 小水獭游河南(暴力)因为要求第一段所有位都不同,所以只需要枚举前26个
2024-05-17 13:11:11
660
原创 【思维】根号分治
做到过两三题根号分治了,来总结一下这个算法与其说是算法,不如说是一种思维根号分治的主要思路是,数据范围很大的时候(指不能接受n2复杂度,但可以接受nn复杂度的情况,通常是1e8−1e9),将数据分为两个部分,一个是小于n的部分,一个是大于等于n。
2024-05-13 21:34:29
1016
原创 2023年湖北省大学生程序设计竞赛题解
感性理解一下,如果第一个人的值是 x,其他人必须要比 x 大才能让第一个人输(如果也是 x 的话相当于没作用),所以情况总数是。位的数字即可,如果数字是 1,说明它左右两边的字母不一样,如果大于 1,说明左右两边字母一样,根据这个填上右边的字母就好了。进行分解,分解出所有的质数,将不同的质数种类分配给 a 和 b(用二进制分配),然后解出 x 和 y,取最小的。然后从前往后遍历,到某一个位置,如果值小于0,那么就加这个位置之前的最大值,直到加到大于等于 0 为止。,所以 每一个人赢了第一个人的概率就是。
2024-05-09 13:27:23
838
原创 2023年广东省大学生程序设计竞赛题解
我们可以把所有颜色捡到一棵树上,用动态开点线段树,然后再存储一下每个颜色的树根结点,每次从这个颜色的根节点往下找就可以。输入的时候存储每一个数字所在的位置,然后二分,把路径存储下来,按 x 排序,判断 y 有没有不合理的地方即可。个颜色的出现次数,再把集合内的颜色累加一下得到答案,但是直接加会mle的很惨,所以考虑一下怎么优化。首先看查询操作,很容易想到,就是要找包含起始点的最长子段,子段的左端点和右端点都可以通过二分找到。个,说明这一段都是满足条件的,mid 可以继续往左搜索,否则往右搜索。
2024-05-06 19:17:07
1046
原创 【牛客】牛客小白月赛92 题解 A - F
之后还是在体力允许的情况下,记录一下挖走每个第1层和第5层的矿石需要多少体力,如果在同列的第2层和第4层有矿石的话,只用消耗1体力,没有就要消耗2体力,放在vector里面排个序,从小往大取直到体力小于0。表示前 i 个物品,至少获得 j 个矿石的最短时间,0表示还没用技能,1表示已经用了技能。之后把所有除以3上取整相同的数存进一个map里,因为之后他们的变化都是相同的。首先在体力允许的条件下,把第2层和第4层的矿石全挖走。先把整个草皮挪到所有羊的右边,此时价值为1。,价值的变化量是两块草皮的价值之差。
2024-04-29 10:13:54
488
原创 2023年ICPC杭州站题解
假设这条边的两个端点是 i j,如果 i j 不是 1 2 的话,直接先让 i 和 i - 2 连,有边再让 i 和 i - 1 连,如果还是有边就说明是星形,如果没有边就让 j 和 i - 2、i - 1 连(很容易判断就不详细说了),如果 i j 是 1 2 的话就需要单独注意一下。,看到这就很容易想到那个 n/2 是两两之间连一次吧,如果从头到尾都没碰到相连的边,说明不可能是星形(因为根本没有中间的那个点),一定是链,一旦碰到一个相连的边,就立刻停下。标记),其他就正常跑最短路,然后距离在。
2024-04-28 15:56:58
1174
5
原创 2023年第13届山东省大学生程序设计竞赛题解
所以我们只需要枚举相同的前缀和长度:i 从 v 开始,每次找到最末尾的一个0并将其替换为1(即加上lowbit),假设路径按位与之后的前缀和长这样,我们需要判断有没有这样的路径可以满足条件。很容易发现,先进行一次操作1再进行一次操作2之后,前面进行过的操作1会被抵消,所以操作1永远不会在操作2前面进行,因此操作顺序是:先进行完所有的操作2,再进行所有的操作1。怎么消去呢,左边的可以利用以左上角为顶点和以右下角为顶点的方式消去,上边的可以利用以左上角为顶点和以右上角为顶点的方式消去。
2024-04-27 10:57:09
2710
1
原创 2024.4.15-4.21 训练记录(27)
同时这里又有个二分性,如果在前 j 个 b 中我们选择了第 i 个 b ,那么我们称 i 是对于 j 的最优决策点,可以发现,最优决策点一定是非递减的,所以套个二分处理(其实这里也没有理解的很好,但主席树真的调了超级无敌久)换之前的根是 u,换之后的是 ver,从 u 换到 ver ,所有在 ver 子树中的结点到根的距离加一,其他结点到根的距离减一。很明显先按b排序,然后枚举b,再找b和b之前对应的a中最大的k个值,这个用主席树维护。,但是没注意到 n 挺小的完全暴力查找就可以,一直在想怎么二分找值。
2024-04-22 10:33:47
831
原创 2024.4.8-4.14 训练记录(26)
说得更清楚一点,第一个操作可以减少数组首项的值,同时把差分数组中小于0的数加1,第二个操作可以把差分数组中大于0的数减1(且不会造成其他任何影响,也就是第二个操作可以随意进行,所以我们不用管差分数组中大于0的数)这题的困难之处就是看数据不能n方枚举,但是又不能不枚举,所以观察数据,发现a最大是2.5e6,说明之后相加的和不会超过5e6,枚举这个复杂度是可以接受的,所以就还是枚举,最坏情况下枚举5e6次是一定能找到一样的。第二个思路是bfs更新每个点的状态,利用优先队列先处理b小的位置,但后来发现也不对。
2024-04-18 14:06:59
302
原创 【数据结构】可并堆 / 左偏树
左偏树也叫可并堆,那么首先它具有堆的性质(大跟堆/小根堆),同时又有左偏性质,什么叫左偏呢?我们把没有左儿子或者没有右儿子的结点叫做外结点,dist表示每个结点到距离最近的外结点的距离(特殊的,外结点的dist是 -1)左偏的意思就是每个结点的左儿子的dist总是比右儿子大怎么保证合并时的时间复杂度呢?因为每个结点的左儿子的dist总是比右儿子大(可以感性理解为左边比右边深度大),这样每次合并的时候我们总是合并到右结点上,时间复杂度就不会很高(因为我是个数学蒟蒻所以就不证明了)
2024-04-09 16:37:30
500
原创 【数据结构】FHQ-Treap
/ 分别表示根结点编号和当前用到哪个结点int val[N];// 结点权值int pri[N];// 结点优先级int sz[N];// 结点子树大小// 结点左右儿子fhq-treap依然是一棵中序遍历按照val排序的平衡树,但是它的结构依赖于pri优先级,一个结点的两个儿子的pri一定比这个结点要小,然后我们随机取pri,就可以保证treap基本平衡。
2024-04-08 08:43:01
300
原创 2024.4.1-4.7 训练记录(25)
智慧题,因为010101这样的串我们可以直接消掉,所以没必要考虑这个,只要考虑11和00这样连在一起的串就可以,因为每两个相同的字母连在一起我们就要额外再消一次,所以前缀和计算一下有多少11和多少00,然后取大的(为什么取大的呢?因为举个例子:11[可以消掉的部分]00,我们可以先把中间消掉,然后变成:1100,把中间的10消掉,就可以减少需要的次数了)
2024-04-08 07:18:08
163
原创 2024.3.25-26 训练记录(23)
如果没环就一定符合条件,因为我们知道在拓扑图中,拓扑序小的可以通向拓扑序大的,相反不行,所以我们直接将无向边中拓扑序小的指向大的就可以。首先建图跑dfs,维护当前结点以及上方的最小的代价,再维护每个结点需要1转0和0转1的个数,每次处理小的那个就可以。这题就是,大于等于mid就记为1,否则记为0,然后因为只有八位,完全可以用二进制表示。这一题的两个收获,一个是学会了字符串哈希,还有接触到了之前没碰到过的字典树上dfs。不是答案具有二段性才能用二分,如果能在二分的时候更新你想要的答案一样可以二分。
2024-04-02 07:51:11
436
原创 2024.3.23 训练记录(22)
因为1为根结点的这个子树很可能是不满足条件的,但是我们底下满足条件的子树已经达到要求了,所以1不满足要求也没关系。对每一个输入的字符串求 ne 数组,然后用前面已经处理过的字符串求相同的前后缀。第二道自己写的2000!,那走到就是胜利,除非起点和终点一样(这个情况需要特判一下)有个要注意的卡我好久的地方是,最后判断的时候不能加上。dfs,从下往上看,某个子树满足条件就砍一刀。,那lkr三个位置的只需要一次就可以消掉了。思路是起点开始跑bfs,除了终点外的。是不能走的,一般情况下如果终点是。
2024-03-23 20:35:27
347
原创 2024.3.21 训练记录(21)
首先跑dijkstra,记录下每个点最短路的入度,然后遍历每一条铁路,如果最短路小于铁路长度,这个铁路就可以删掉,如果最短路等于铁路长度并且最短路入度大于1,说明还有其他路径可以到这个点,就把入度减一并且把这条铁路删掉。我们怎么看他有没有被插队呢,我们用优先队列维护已经吃过饭的人,如果队头的人的优先级比cur以及cur之后所有还没吃饭的人的优先级低,那他就没法插队到cur前面,否则就是队头的人打饭(所以维护一下每个点的后缀最大值)想到了如果k旁边的一个数大于k,那就可以只选这两个数把另一个数也变成k。
2024-03-22 09:18:04
407
原创 2024.3.19 训练记录(20)
借着这道题复习了AC自动机,虽然这题并不需要,但还是有点价值的。先用 kmp 求出 ne 数组。表示前缀 i 出现的次数,
2024-03-20 14:52:03
296
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人