文章分类 - 算法竞赛 / 模板题目
摘要:在这里尝试记录一下各种比较不错可做的dp复习和练习记录。(这里只会写大概的思路和抽象的代码。) 最长上升子序列 给一个长度为 \(N\) 的数列,求数值严格单调递增的子序列的长度最长是多少。 直接暴力枚举从哪里转移过来的 \(O(N^2)\)。 rep(i, 1, n+1) rep(j, 1, i)
阅读全文
摘要:用f[i]带标i能到达点的数量,如果要计算u能到达的点的数量,则需要计算所有f[v1] U f[v2] U f[v3] U ......。那么可以先通过拓扑排序建出一个拓扑图,然后逆向计算,在这个过程中用到一个bitset的技巧,bitset可以建立一个长度为n的01串,然后对于某一个点x,x的串上
阅读全文
摘要:失败不是什么丢人的事情,从失败中全无收获才是。 这里只讲述两种特殊问法,一种是求具体方案(转移路径),另一种是求最优方案数量。 在讲述之前先要明白两种dp数组初始化的方式,dp数组初始化只与对它的定义有关。总的来说有两种定义方式。方式一:dp[i][j]代表前i个物品体积不超过j的最大价值,那么这时
阅读全文
摘要:一眼思路题。思路比较明显做法也比较套路,只不过实现过程中重复的项比较多写起来比较麻烦不过写的时候基本也不用动脑子按照题目的要求一点一点实现就好了。 只不过昨天做的时候快做完了结果教室关门了只好留到今天做,今天早上不想接着昨晚的写了直接删了重写。做到最后发现卡到输出方案了,因为我在做bfs的时候是开了
阅读全文
摘要:首先也是最短决策。非常适合线性bfs(改个名字)。 就很恶心,代码有点长比较容易出错,然后就是POJ没有c++11,写的直接入土。 主要思路还是比较简单就是说四位数字,分别枚举每一位数字的出边,每一个数字的出边最多有10种情况,辅助函数比较多需要仔细写写,筛质数和check函数都是看的评论区改进了一
阅读全文
摘要:一维bfs瞎起的就随便说说,主要是平常bfs求最短路感觉常见简单的都是二维起步,然后今天发现其实bfs做普通边权为1的最短路小题非常的好用~ 首先就是怎么不重不漏枚举所有情况呢,就可以比如第一个数是1,第二个数就有两种选择:1 * 10和1 * 10 + 1,其实就是不漏了,非常的巧妙(明显)。 1
阅读全文
摘要:呃呃USACO真的是除了John就是Cow.... 就就是很像之前一个做过的题的翻版忘记叫啥名字了,基本一模一样,这次基本做出来了但是忘了枚举第一行的意义:其实就是如果第一行固定了的话答案其实也就固定了,所以只需要枚举第一行所有的次数,接着根据上一行推下一行就完事了,需要额外记一个答案数组,我的评价
阅读全文
摘要:如果题目给定一个节点的父亲是谁,那么只需要建单向边就可以。 此题没有给定,只需要转化一下,维护一个pre数组记录这个节点的上一个点是谁就可以(或者在dfs时记录一个from)。 倍增法求LCA大体的思路是这样的:首先从树根dfs一遍求出所有节点到树根的距离(并且在点之间模拟出一条有向边),接着倍增法
阅读全文
摘要:首先树的遍历分为三种,分别是先序中序和后序(根左右,左根右,左右根): 1 struct TreeNode { 2 int l, r, fa; 3 } a[N]; 4 void dfs(int u) { 5 cout << a[u] << ' '; 6 if (a[u].l) 7 dfs(a[u].
阅读全文
摘要:此题需要发现一个十分隐秘的限制。 首先以前缀和的角度考虑题面,若【r,l】中存在奇数个1,就说明s[r] - s[l - 1] 是奇数,就说明s[r]和s[l - 1]是不同奇偶性的,此时将只是将s[r]和s[l - 1]看作两个不同的变量(十分的抽象),那么这个性质是具有传递性和对称性的(x和y的
阅读全文
摘要:发现如果连接两个点的时候这两个点已经在同一个集合里了,那么说明这条边一定是形成回路的一条边。。。 1 #include <iostream> 2 using namespace std; 3 4 const int N = 400010; 5 int p[N]; 6 int n, q; 7 8 in
阅读全文
摘要:其实这个题不能算是ST表吧,可以算是一个初等数据结构题,有很多做法。 做法一:用反向ST表做,因为每次操作都是暴力在数组末尾加数,所以ST表可以实现O(logn)的插入(具体反向思想我还没搞懂,搞懂了回来补)。 代码 : 1 #include <bits/stdc++.h> 2 #define go
阅读全文
摘要:ST表的功能很简单 它是解决RMQ问题(区间最值问题)的一种强有力的工具 它可以做到O(nlogn)预处理和O(1)查询最值 预处理: 首先预处理出lg数组(或者使用内置函数__lg()),预处理f数组.... 查询: 代码: 1 #include <bits/stdc++.h> 2 #define
阅读全文
摘要:1.对于给定的一段正整数序列,逆序对就是序列中 i < j && a[i] > a[j] 的有序对。 首先可以运用归并排序来求(可惜我还没有完全自然地理解归并排序),好消息是树状数组也可以求。 那么对于逆序对有两种,一种较为简单的是给定的数组是一个排列(意味着没有重复数组并且最大数字n可能较小),在
阅读全文
摘要:输入输出样例 输入 #1复制 3 3 1 2 3 2 1 3 1 1 3 2 1 3 输出 #1复制 2 0 输入 #2复制 5 6 1 2 3 4 5 2 1 3 1 1 3 2 1 5 2 4 4 1 1 1 2 4 4 输出 #2复制 2 5 4 4 题解(引用luogu评论区): 单点修改区
阅读全文
摘要:题目描述 有一个 n 个元素的数组,每个元素初始均为 0。有 m 条指令,要么让其中一段连续序列数字反转——0 变 1,1 变 0(操作 1),要么询问某个元素的值(操作 2)。 例如当 n = 20 时,10 条指令如下: 输入格式 第一行包含两个整数 n, m,表示数组的长度和指令的条数; 以下
阅读全文
摘要:https://www.luogu.com.cn/problem/P1892 本题涉及扩展域并查集。 所谓扩展域并查集其实就是一个并查集存储了多个属性,以此题为例,p[x]存储了x的朋友是谁,p[x + n]存储x的敌人是谁,以此为扩展p[x + a * n]代表x的第a个属性,可以理解为用空间来存
阅读全文
摘要:# [JSOI2008] 星球大战 ## 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系。 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球。这些星球通过特殊的以太隧道互相直接或间接地连接。 但好景不长,很快帝国又重新造出了
阅读全文

浙公网安备 33010602011771号