Loading

文章分类 -  算法竞赛

摘要:0/1 分数规划 算法细节 分数规划通常用来求一个形如 $ a_i, b_i, w_i \in {0,1} $,最小化或最大化 $ \displaystyle\frac{\sum_{i=1}^{n}a_i\times w_i}{\sum_{i=1}^{n}b_i\times w_i} $ 对于这类问 阅读全文
posted @ 2024-06-26 12:13 KakaDBL 阅读(32) 评论(0) 推荐(0)
摘要:拿一道比较经典的例题来作为引入 旅行商问题(TSP) 给定 \(n\) 个城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。$ n \leq 18$ 首先最暴力的解法就是去进行一个 \(O(n!)\) 的 \(dfs\),显然是无法通过此题的。这里利用状态压缩的想法, \(d 阅读全文
posted @ 2024-03-22 21:36 KakaDBL 阅读(42) 评论(0) 推荐(0)
摘要:对顶堆 todo pbds库 使用前提 首先在头文件中加入: #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; typedef tree< 阅读全文
posted @ 2024-03-20 11:16 KakaDBL 阅读(157) 评论(0) 推荐(0)
摘要:拿一道比较经典的例题来作为引入 [POI2008] STA-Station 给定一个 \(n\) 个点的树,请求出一个结点,使得以这个结点为根时,所有结点的深度之和(路径和)最大。 一个结点的深度之定义为该节点到根的简单路径上边的数量。 \(1 \leq n \leq 10^6\),\(1 \leq 阅读全文
posted @ 2024-03-18 17:03 KakaDBL 阅读(37) 评论(0) 推荐(0)
摘要:https://atcoder.jp/contests/arc154/tasks/arc154_b 题目大意 给你长度为 \(N\) 的字符串 \(S\) 和 \(T\),它们由小写英文字母组成。 您可以重复下面的操作任意多次。 擦除 \(S\) 的第一个字符,并在 \(S\) 的任意位置插入相同的 阅读全文
posted @ 2024-03-12 17:42 KakaDBL 阅读(19) 评论(0) 推荐(0)
摘要:在这里尝试记录一下各种比较不错可做的dp复习和练习记录。(这里只会写大概的思路和抽象的代码。) 最长上升子序列 给一个长度为 \(N\) 的数列,求数值严格单调递增的子序列的长度最长是多少。 直接暴力枚举从哪里转移过来的 \(O(N^2)\)。 rep(i, 1, n+1) rep(j, 1, i) 阅读全文
posted @ 2024-03-12 12:18 KakaDBL 阅读(42) 评论(0) 推荐(0)
摘要:https://atcoder.jp/contests/abc336/tasks/abc336_d 题目大意 给定一个数组 \(a\),求经过以下操作可以得到的最长的金字塔序列。 金字塔序列形如 \(1,2,3,4,5,...,k-1,k,k-1,...5,4,3,2,1\)。 可进行的操作为: 将 阅读全文
posted @ 2024-03-05 22:12 KakaDBL 阅读(35) 评论(0) 推荐(0)
摘要:本篇灵感来自于ABC E - Somen Nagashi,题目有更好的做法,这里只说关于线段树二分的做法 二分查找是一个比较常见的将 \(O(N)\)的操作优化为 \(O(logN)\),但是前提是这个被操作的序列需要具有单调性,那么在一道题目中,我们是否可以有意人为构建出单调性来供我们进行二分操作 阅读全文
posted @ 2024-02-29 14:16 KakaDBL 阅读(29) 评论(0) 推荐(0)
摘要:用f[i]带标i能到达点的数量,如果要计算u能到达的点的数量,则需要计算所有f[v1] U f[v2] U f[v3] U ......。那么可以先通过拓扑排序建出一个拓扑图,然后逆向计算,在这个过程中用到一个bitset的技巧,bitset可以建立一个长度为n的01串,然后对于某一个点x,x的串上 阅读全文
posted @ 2023-03-08 20:57 KakaDBL 阅读(41) 评论(0) 推荐(0)
摘要:失败不是什么丢人的事情,从失败中全无收获才是。 这里只讲述两种特殊问法,一种是求具体方案(转移路径),另一种是求最优方案数量。 在讲述之前先要明白两种dp数组初始化的方式,dp数组初始化只与对它的定义有关。总的来说有两种定义方式。方式一:dp[i][j]代表前i个物品体积不超过j的最大价值,那么这时 阅读全文
posted @ 2023-03-06 20:49 KakaDBL 阅读(30) 评论(0) 推荐(0)
摘要:最近做了一道ABC的D搞判断闭环搞了好久。。。其实会的方法挺多的但是做那个题的前一天睡眠严重不足导致脑子浑浊不清,索性来写个blog总结一下吧,顺便每种方法我尽量放上题目来更好的加深回忆。 1.并查集O(logn) 首先最简便的方法我觉得是首选并查集的,对于无向图和有向图都是满足的。主要思想就是如果 阅读全文
posted @ 2023-03-03 16:17 KakaDBL
摘要:此题主要解题关键点就是Pigeonhole principle。 确实是没往数据方面思考直接纯模拟做的,非常蠢。可以看出最多三位字符串按字典就已经有26 + 26 * 26 + 26 * 26 * 26 > 1000了,所以MEX的最大长度就是3。那就可以预处理一下就好了,但是自己在处理的时候非常蠢 阅读全文
posted @ 2023-03-03 10:45 KakaDBL 阅读(27) 评论(0) 推荐(0)
摘要:一开始会想双端bfs,好像可写但是太麻烦,这个题的难点主要就是题目中两个颜色的限制。 正解是dp。dp[i][j]代表从1号店扩展的点到i,从n号点扩展的点到j的最短距离,然后题目存边的时候可以分开两类颜色去存,每个点的出边有两种,一种是颜色是red的另一种是颜色是blue的。然后bfs(今天才知道 阅读全文
posted @ 2023-02-28 22:30 KakaDBL 阅读(34) 评论(0) 推荐(0)
摘要:首先把x一直减去一个cnt++(cnt = 0)。 如果x正好等于0,则答案就是减去的次数很好理解;如果x小于0,不等于-1的话也是减去的次数,可以列出等式,如下图,右边是等于-1则答案需要加一。 #include <bits/stdc++.h> using namespace std; #defi 阅读全文
posted @ 2023-02-28 13:34 KakaDBL 阅读(23) 评论(0) 推荐(0)
摘要:一眼思路题。思路比较明显做法也比较套路,只不过实现过程中重复的项比较多写起来比较麻烦不过写的时候基本也不用动脑子按照题目的要求一点一点实现就好了。 只不过昨天做的时候快做完了结果教室关门了只好留到今天做,今天早上不想接着昨晚的写了直接删了重写。做到最后发现卡到输出方案了,因为我在做bfs的时候是开了 阅读全文
posted @ 2023-02-19 23:22 KakaDBL 阅读(34) 评论(0) 推荐(0)
摘要:首先也是最短决策。非常适合线性bfs(改个名字)。 就很恶心,代码有点长比较容易出错,然后就是POJ没有c++11,写的直接入土。 主要思路还是比较简单就是说四位数字,分别枚举每一位数字的出边,每一个数字的出边最多有10种情况,辅助函数比较多需要仔细写写,筛质数和check函数都是看的评论区改进了一 阅读全文
posted @ 2023-02-18 22:48 KakaDBL 阅读(24) 评论(0) 推荐(0)
摘要:一维bfs瞎起的就随便说说,主要是平常bfs求最短路感觉常见简单的都是二维起步,然后今天发现其实bfs做普通边权为1的最短路小题非常的好用~ 首先就是怎么不重不漏枚举所有情况呢,就可以比如第一个数是1,第二个数就有两种选择:1 * 10和1 * 10 + 1,其实就是不漏了,非常的巧妙(明显)。 1 阅读全文
posted @ 2023-02-18 22:42 KakaDBL 阅读(25) 评论(0) 推荐(0)
摘要:呃呃USACO真的是除了John就是Cow.... 就就是很像之前一个做过的题的翻版忘记叫啥名字了,基本一模一样,这次基本做出来了但是忘了枚举第一行的意义:其实就是如果第一行固定了的话答案其实也就固定了,所以只需要枚举第一行所有的次数,接着根据上一行推下一行就完事了,需要额外记一个答案数组,我的评价 阅读全文
posted @ 2023-02-18 22:38 KakaDBL 阅读(19) 评论(0) 推荐(0)
摘要:如果题目给定一个节点的父亲是谁,那么只需要建单向边就可以。 此题没有给定,只需要转化一下,维护一个pre数组记录这个节点的上一个点是谁就可以(或者在dfs时记录一个from)。 倍增法求LCA大体的思路是这样的:首先从树根dfs一遍求出所有节点到树根的距离(并且在点之间模拟出一条有向边),接着倍增法 阅读全文
posted @ 2023-02-14 22:26 KakaDBL 阅读(31) 评论(0) 推荐(0)