06 2017 档案
摘要:传送门 不知为什么,判断全部包含反而A不了,不判断反而A了,╮(╯▽╰)╭ 代码
阅读全文
摘要:传送门 超级大模拟。。 代码
阅读全文
摘要:传送门 一个模拟。 代码
阅读全文
摘要:传送门 这不能算是数论题。。。 卡精度这事noip也做的出来。。 代码
阅读全文
摘要:传送门 蒟蒻我关系式没有找出来。 直接模拟递推过程好了。 代码
阅读全文
摘要:传送门 这么水的题,也只有提高组第一题了吧 代码
阅读全文
摘要:传送门 贪心。。。蒟蒻证明不会。。。 每一次找最大的即可,找出一次最大的,数列会分为左右两边,左边用stl优先队列维护,右边用树状数组维护。。 (线段树超时了。。。。) 代码
阅读全文
摘要:传送门 搞个前缀和随便DP一下 代码
阅读全文
摘要:传送门 看到题后整个人成了mengbier 但是仔细分析一下就很简单了,先确定好输出的图的长和宽。 然后从输入的矩形的左上角的最下面的开始填充,顺序是从下到上,从左到右,从后往前。 填充的时候直接覆盖掉原先的就可以。 代码
阅读全文
摘要:传送门 数据很小,可以DFS,判断的时候用背包DP 然而不知到枚举到哪里。。。。 首先枚举前可以求一遍题目中的MAX,下一层DFS的时候可以只枚举到MAX + 1,因为再往上就必定会出现断层 蒟蒻很菜,人为规定背包上界。。。。 然后可以A 代码
阅读全文
摘要:传送门 这道题纯粹是考数学。编程复杂度不大(别看我写了一百多行其实有些是可以不必写的)。 计算位数不必用高精时刻存,不然可想而知时间复杂度之大。首先大家要知道一个数学公式 logn(a*b)=logn(a)+logn(b)至于证明翻数学书吧。而且,用log10(n)+1即可求出n的位数。 则2^p的
阅读全文
摘要:传送门 先用 floyd 求出每一个数可以变成那些数。 然后利用乘法原理求解,需要高精度。 代码
阅读全文
摘要:传送门 nc题,一直sort就过了 代码
阅读全文
摘要:传送门 类似高精的操作。。。 代码
阅读全文
摘要:传送门 弄两个栈,一个存数,一个存运算符,然后乱搞。 代码
阅读全文
摘要:传送门 递归。。 代码
阅读全文
摘要:传送门 终于过了这sb题了。 当初我连这道题都A不了(╯▔皿▔)╯ 代码
阅读全文
摘要:传送门 模拟 代码
阅读全文
摘要:传送门 模拟就好! 然后需要把一圈的有楼梯的都记录一下,取膜乱搞。 代码
阅读全文
摘要:传送门 如果去关某一个灯,那么途中经过的灯都能关闭,那么就是连续一段区间,区间DP。 f[i][j][0] 表示关完 i, j 这个区间且在 i 这个位置 f[i][j][1] 表示关完 i, j 这个区间且在 j 这个位置 代码
阅读全文
摘要:传送门 题解 代码
阅读全文
摘要:传送门 数位DP入门题。 然而没有个讲解蒟蒻我真心看不懂。 推荐好的讲解一份——点我 代码(递推) 代码(记忆化搜索)
阅读全文
摘要:传送门 这题。。。。得考虑一些奇奇怪怪的复杂情况 不过也有简便方法。 枚举时间,先算出来只用魔法走的时间。 然后再枚举一遍时间,再算只走的时间,两个比较一下,取最游值。 代码
阅读全文
摘要:传送门 先按照时间排序 f[i][j] 表示 前i个物品高度为j时所剩余的最大能量 显然每个物品有堆和吃两种选择 状态转移看代码 代码
阅读全文
摘要:传送门 f[i][j][0] 表示从右下角到左上角,以(i,j)为起点能延伸的最大值 f[i][j][1] 表示从左下角到右上角,以(i,j)为起点能延伸的最大值 up[i][j] 表示(i,j)上面有多少个0 left[i][j] 表示(i,j)左边有多少个0 right[i][j] 表示(i,j
阅读全文
摘要:传送门 By tinylic 如果没有b[i]这个属性的话就是明显的01背包问题。 现在考虑相邻的两个物品x,y。假设现在已经耗费p的时间,那么分别列出先做x,y的代价: a[x]-(p+c[x])*b[x]+a[y]-(p+c[x]+c[y])*by a[y]-(p+c[y])*b[y]+a[x]
阅读全文
摘要:传送门 f[i][j] 表示前 i 盆花,放到前 j 个花盆中的最优解 pre[i][j] 记录前驱 代码
阅读全文
摘要:传送门 三点在树上距离相等的情况只有一种,就是以某一个点为中心,三个点到这个点的距离相等。 所以直接枚举每个点作为中心,dfs这个中心的子树,根据乘法原理统计答案即可。 时间复杂度 O(n2) (n <= 5000) 代码
阅读全文
摘要:传送门 什么鬼的题? 代码
阅读全文
摘要:传送门 f[i][j]表示区间 i-j 合并的最大值 转移: 若f[i][k] && f[k+1][j] && f[i][k] == f[k+1][j] --> f[i][j] = max(f[i][k]+1,f[i][j]) 但要注意, 若f[i][k]!=f[k+1][j],那么无法进行转移 代
阅读全文
摘要:传送门 设f[i]表示i个鼹鼠出现后,打死鼹鼠的最大值 动态转移方程:f[i]=max{f[j]+1}, 条件:abs(x[i]-x[j])+abs(y[i]-y[j])<=time[i]-time[j] (j<i) 代码
阅读全文
摘要:传送门 每次拿完还得回去。。。 数据中有两个需要注意的地方: 把每个桃树想象成物品,体力和时间的最小值想象成空间 由于摘完一次就要回到起点,所以每颗桃树的体力为 2 * (x + y), x y 分别为此桃树对应的横纵坐标
阅读全文
摘要:传送门 分解质因数,不说了 这题坑了我2个多小时 教训 不熟悉位运算的优先级一定要加括号!!!!
阅读全文
摘要:传送门 背包 ——代码
阅读全文
摘要:传送门 由题意得 gcd(x, a0) = a1 ——> gcd(x / a1, a0 / a1) = 1 lcm(x, b0) = b1 ——> x * b0 / gcd(x, b0) = b1 ——> gcd(x, b0) = x * b0 / b1 ——> gcd(b1 / b0, b1 /
阅读全文
摘要:传送门 dp[i][j][0] 表示点 i 在以 i 为根的子树中范围为 j 的解 dp[i][j][1] 表示点 i 在除去 以 i 为根的子树中范围为 j 的解 状态转移就很好写了 ——代码
阅读全文
摘要:传送门 相当于背包, f[i][j] 表示当前数为 i,能分解成 j 个数的平方的和的数量 那么就是统计背包装物品的数量 ——代码
阅读全文
摘要:传送门 可以看出 (i, j) 能被看到,(i * k, j * k) 都会被挡住 暴力 所以 gcd(i, j) == 1 的话 ans ++ 那么可以枚举一半(中轴对称),求解答案,只能拿30分 正解 可以看出,gcd(i,j) == 1 才能对答案有贡献,也就是互质,想到什么?phi 值 其实
阅读全文
摘要:传送门 一.暴力枚举(加了点优化) 二.降维 通过关系式 x * y == gcd(x, y) * lcm(x, y) 可以枚举 x,根据等式求 y
阅读全文
摘要:传送门 我直接用 long long 暴力,居然过了 ——代码 有个比较好理解的方法是 因为末尾的0是由因子 2 和 因子 5 乘出来的 所以取出每一个数的因数 2 和 5,两者相抵消,最后再把没有抵消掉的乘回去
阅读全文
摘要:传送门 用类似筛法的原理,就好啦 ——代码 换一个思路,考虑每一个数对答案的贡献,发现 1 是 n / 1 2 是 n / 2 3 是 n / 3 。。。。。。 那么枚举就好了
阅读全文
摘要:传送门 对于数论只会gcd的我,也要下定决心补数论了 列出方程 (x + t * m) % l = (y + t * n) % l 那么假设 这两个式子之间相差 num 个 l,即为 x + t * m = y + t * n + num * l 经过化简得 (n - m) * t + l * nu
阅读全文
摘要:传送门 就是个模板啦 记录每一个点的左端点颜色和右端点颜色和当前端点颜色段数。 合并时如果左孩子右端点和右孩子左端点不同就 ans-- 在重链上跳的时候别忘记统计一下 ——代码
阅读全文
摘要:传送门 题意:一棵n个节点的树。wc爱跑步,跑n天,第i天从第i个节点开始跑步,每次跑到距第i个节点最远的那个节点(产生了n个距离),现在要在这n个距离里取连续的若干天,使得这些天里最大距离和最小距离的差小于M,问怎么取使得天数最多? 求每个点到最远距离的点的距离可以用 computer 的方法。
阅读全文
摘要:传送门 题意:给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用不能超过上限limit,问在保证总费用<=m下的最小的limit 二分答案,再 DP,看看最终结果是否小于 m ——代码 1 #include <cstdio> 2 #include <cstring> 3
阅读全文
摘要:传送门 原本想着 f[i] 表示前 i 个任务的最优答案,但是不好转移 看了题解后,发现是 f[i] 表示前 i 分钟的最优解,看来还是不能死脑筋,思维得活跃,一个思路行不通就换一个思路。 把 f 数组置为 -INF,f[0] = 0 如果当前时间不是任务开始的时间,f[i] = max(f[i],
阅读全文
摘要:传送门 将问题转换成分组背包,每一组有上下两个,每一组中必须选则一个,上面的价值为0,下面的价值为1,求价值最小 因为要求上下两部分差值最小,只需从背包大小为总数 / 2 时往前枚举,找最小答案即可。 ——代码 1 #include <cstdio> 2 #include <cstring> 3 #
阅读全文
摘要:传送门 二分答案再判断即可 ——代码 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #define max(x, y) ((x) > (y) ? (x) : (y)) 5 #define N 1000001 6
阅读全文
摘要:传送门 记录 up[x] 表示 x 上方有多少个 all[x] 表示当前连通的有多少个 find 的时候 和 合并的时候 更新一下即可 ——代码 1 #include <cstdio> 2 #include <iostream> 3 #define N 30001 4 #define abs(x)
阅读全文
摘要:传送门 呵呵的最小生成树 ——代码 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 5 #define N 100001 6 7 int n, m, sum; 8 int f[N]; 9 10 struct nod
阅读全文
摘要:传送门 并查集真是一个判断连通的好东西! 连通性用并查集来搞。 把每一条边按照 a 为关键字从小到大排序。 那么直接枚举,动态维护 b 的最小生成树 用 a[i] + 1 ~ n 路径上最大的 b[i] 更新答案即可 ——代码 1 #include <cstdio> 2 #include <iost
阅读全文
摘要:传送门 WC这个题真是丧心病狂啊,就是想学习一下怎么处理边权,给我来了这么一个破题! ORZ hzwer 临摹黄学长代码233 但还是复杂的一匹 理一下思路吧 题目大意:给定一个无向图,多次删除图中的某一条边,求两点间路径最大值的最小值 求两点间的路径最大值的最小值的话,可以求最小生成树,那么这个值
阅读全文
摘要:传送门 水题 ——代码 1 #include <queue> 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #define N 51 6 #define M 100001 7 #define INF 1e9 8 #d
阅读全文
摘要:传送门 模板。 ——代码 1 #include <cstdio> 2 #include <iostream> 3 #define N 300001 4 #define get(x) (son[f[x]][1] == (x)) 5 #define swap(x, y) ((x) ^= (y) ^= (
阅读全文
摘要:传送门 处理路径 xor 和的时候可以维护子树 xor 和,先提取出路径,再把一个点 splay 到最上方,直接取子树 xor 和即可。 更新一个点权时可以先提取出根到这个点的路径,把这个点 splay 到最上方,然后 update 即可。 ——代码 1 #include <cstdio> 2 #i
阅读全文
摘要:传送门 每个点都会跳到另一个点,连边就是一棵树。 更改弹力就是换边。 求一个点跳多少次跳到终点就是求这个点的深度,那么只需要维护 size 域,access(n + 1) 然后 splay(x),求 size[son[x][0]] 即可, 因为 splay 是以深度为关键字的,所以左端点就是深度比它
阅读全文
摘要:传送门 呵呵 ——代码 1 #include <cstdio> 2 #include <iostream> 3 #define N 1000010 4 #define LL long long 5 #define max(x, y) ((x) > (y) ? (x) : (y)) 6 7 int n
阅读全文
摘要:转载地址 差分约束总结: 今天请教了DQS大神,算是对差分做一个系统性的总结吧,也算是对自己近期不完善理解的差分约束理一遍。 差分约束分为3大类,求最小,求最大,求是否满足约束条件,第三类求是否满足直接判断负环即可,一般都结合前两类来出题。 1:求最小。求最小一般是跑最长路,在已有约束条件下建立超级
阅读全文
摘要:传送门 差分约束裸题 但是坑! 有一个点是长为10W的链,需要逆序加边才能过(真是玄学) 还有各种坑爹数据 开longlong ——代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define N 200001
阅读全文
摘要:传送门 差分约束系统。。找负环用spfa就行 ——代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define N 100001 5 6 int n, m, cnt; 7 int head[N], to[N <
阅读全文
摘要:传送门 比着题解写还错。。。 查了两个小时没查出来,心态爆炸啊 以后再查 ——代码(WA) 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define N 2000001 5 #define Min(x, y) (
阅读全文
摘要:传送门 思维!重要的是思维! 题目让删边,然而并查集不好删边(并!查!集!啊) 我们离线处理,从后往前添边,这样并查集就可以用了。 用并查集维护连通块个数即可。 ——代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4
阅读全文
摘要:传送门 1.贪心 + 优先队列 按照时间排序从前往后 很简单不多说 ——代码 1 #include <queue> 2 #include <cstdio> 3 #include <iostream> 4 #include <algorithm> 5 #define N 10001 6 7 int n
阅读全文
摘要:传送门 up[i] 表示一个木块上面有多少个 all[i] 表示整个连通块内有多少个 那么 一个木块下面的木块个数为 all[root[i]] - up[i] - 1 注意:up[i] 可以在 find 函数中维护,而 all[i] 不好维护,那么我们只需要祖先节点的 all[i] 表示整个连通块内
阅读全文
摘要:传送门 1.并查集骗分(数据太水,比正解还快。。。) 我们知道,并查集有一步操作叫“路径压缩”,但是本题的并查集我们不能路径压缩,否则就无法进行Destroy操作。那每一步操作我们应该怎么做呢? 对于Connect x y操作,先把x变成集合的根,之后root[x] = y; 对于Destroy x
阅读全文
摘要:传送门 通过并查集统计集合个数,easy ——代码 1 #include <cstdio> 2 #include <iostream> 3 #define N 1000001 4 5 int n, m; 6 int f[N], num[N]; 7 8 inline int read() 9 { 10
阅读全文
摘要:传送门 题意: n个人分成三组,玩石头剪子布游戏,同一组的人只能出同样固定的的手势,其中有一个是裁判不属于任何组,可以出任意手势,给出m个信息x op y 表示x,y是从三个组里面随机抽取的或者是裁判,他们之间的输赢关系。让你判断最少在第几组信息时,可以唯一判断出裁判,并将裁判号,以及在第几组后判断
阅读全文
摘要:传送门 和某题类似,只不过奇偶换成了和。 ——代码 1 #include <cstdio> 2 #include <iostream> 3 #define N 1000001 4 5 int n, m, ans; 6 int f[N], d[N]; 7 8 inline int read() 9 {
阅读全文
摘要:传送门 题意:有一个长度已知的01串,给出[l,r]这个区间中的1是奇数个还是偶数个,给出一系列语句问前几个是正确的 思路:如果我们知道[1,2][3,4][5,6]区间的信息,我们可以求出[1,6]的信息 可以将将闭区间[x,y]转换成(x - 1,y]左开右闭区间 那么我们可以用并查集来做,每次
阅读全文
摘要:传送门 1.开两个并查集 f[x] 表示 x 的同类 f[x + n] 表示 x 的敌人 ——代码 1 #include <cstdio> 2 #include <iostream> 3 #define N 200001 4 5 int T, n, m; 6 int f[N]; 7 8 inline
阅读全文
摘要:传送门 经典的并查集问题 对于这种问题,并查集需要分类 开3*n的并查集,其中x用来连接与x同类的,x+n用来连接x吃的,x+2*n用来连接x被吃的。 1 x y时,如果 x吃y 或 x被y吃,那么为假话, 否则x与y同类,x吃的y也吃,x被吃的y也被吃; 2 x y时,如果 x与y同类(x与x自然
阅读全文
摘要:传送门 模型 二分图最大独立集,转化为二分图最大匹配,从而用最大流解决。 实现 首先把棋盘黑白染色,使相邻格子颜色不同。 把所有可用的黑色格子看做二分图X集合中顶点,可用的白色格子看做Y集合顶点。 建立附加源S汇T,从S向X集合中每个顶点连接一条容量为1的有向边,从Y集合中每个顶点向T连接一条容量为
阅读全文
摘要:此题oj上无spj,无法提交 【问题分析】 最大费用最大流问题。 【建模方法】 把网格中每个位置拆分成网络中两个节点<i.a>,<i.b>,建立附加源S汇T。 1、对于每个顶点i,j为i东边或南边相邻的一个节点,连接节点<i.b>与节点<j.a>一条容量为无穷大,费用为0的有向边。 2、从每个石块顶
阅读全文
摘要:传送门 【问题分析】 最大费用最大流问题。 【建模方法】 把网格中每个位置抽象成网络中一个节点,建立附加源S汇T。 1、对于每个顶点i,j为i东边或南边相邻的一个节点,连接节点i与节点j一条容量为1,费用为该边价值的有向边。 2、对于每个顶点i,j为i东边或南边相邻的一个节点,连接节点i与节点j一条
阅读全文
摘要:传送门 输入所有 a[i],求出平均值 sum,每个 a[i] -= sum 那么如果 a[i] > 0,从 s 向 i 连一条容量为 a[i] 费用为 0 的有向边 如果 a[i] < 0,从 i 向 t 连一条容量为 -a[i] 费用为 0 的有向边 每个点 i 和它相邻的两个点连一条容量为 I
阅读全文
摘要:传送门 脑残题 建图都懒得说了 ——代码 1 #include <queue> 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #define N 1000001 6 #define min(x, y) ((x) <
阅读全文
摘要:传送门 水题。 建图都不想说了 ——代码 1 #include <queue> 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #define INF 1e9 6 #define M 101 7 #define N 1
阅读全文
摘要:传送门 吐槽:神tm网络流 dis[i][j][k] 表示到 (i, j) 还有 k 油的最优解 然后跑spfa,中间分一大堆情况讨论 1.当前队头还有油 1.目标点有加油站——直接过去 2.目标点每加油站——1.直接过去 2.在当前点召唤一个加油站再过去 2.没油——召唤加油站再走 ——代码 1
阅读全文
摘要:传送门 吐槽:神tm网络流。。。 用持有的钥匙分层,状态压缩,用 2 进制表示持有的钥匙集合。 dis[i][j][k] 表示持有的钥匙集合为 k,到达点 (i, j) 的最短路径。 分层图的最短路听上去很玄乎,其实通过代码来看还是很好理解的。 ——代码 1 #include <queue> 2 #
阅读全文
摘要:传送门 不同的时间每个飞船所在的地点不同,给我们启示按照时间构建分层图。 同一个地点 x <x, dayi - 1> -> <x, dayi> 连一条容量为 INF 的边,因为人们可以在一个地点等待 艘飞船的路径 如果 a 的下一站是 b,那么 <a, dayi - 1> -> <b, dayi>
阅读全文
摘要:传送门 给定 n 个字符串,求出现或反转后出现在每个字符串中的最长子串。 算法分析: 这题不同的地方在于要判断是否在反转后的字符串中出现。其实这并没有加大题目的难度。 只需要先将每个字符串都反过来写一遍,中间用一个互不相同的且没有出现在字符串中的字符隔开, 再将 n 个字符串全部连起来,中间也是用一
阅读全文
摘要:传送门 统计大于一半的串中都出现过的子串,有多个按照字典序输出 二分子串长度 k,用 k 将height 数组分组,接下来直接判断就 ok。 有个小细节,平常统计所有串中都出现的最长子串时,把所有子串拼接起来的符号可以是相同的,但是这个题不行。(为什么?好好想想) ——代码 1 #include <
阅读全文
摘要:传送门 dp没怎么理解好。。。QAQ f[i][j]表示长度为i,当前节点为j的方案数 ——代码
阅读全文
摘要:传送门 求一个串的最长回文子串的长度 1.后缀数组 把这个串反转后接到原串的后面,中间连一个没有出现过的字符。 然后求这个新字符串的某两个后缀的公共前缀的最大值即可。 ——代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream
阅读全文
摘要:Tyvj传送门 luogu传送门 经典题 统计一个字符串中不同子串的个数 一个字符串中的所有子串就是所有后缀的前缀 先求出后缀数组,求出后缀数组中相邻两后缀的 lcp 那么按照后缀数组中的顺序遍历求解 每一个后缀 suffix(sa[i]) 对于答案的贡献为 len - sa[i] - height
阅读全文
摘要:传送门 给定一个字符串 L,已知这个字符串是由某个字符串 S 重复 R 次而得到的,求 R 的最大值。 1.后缀数组 做法比较简单,穷举字符串 S 的长度 k,然后判断是否满足。判断的时候, 先看字符串 L 的长度能否被 k 整除,再看 suffix(1)和 suffix(k+1)的最长公共 前缀是
阅读全文
摘要:传送门 其实我就是想练练 st表 本以为学了线段树可以省点事不学 st表 了 但是后缀数组中用 st表 貌似很方便 所以还是学了吧,反正也不难 ——代码 1 #include <cstdio> 2 #define N 100001 3 #define min(x, y) ((x) < (y) ? (
阅读全文
摘要:传送门 求 n 个串的字典序最小的最长公共子串。 和 2 个串的处理方法差不多。 把 n 个串拼接在一起,中间连上一个没有出现过的字符防止匹配过界。 求出 height 数组后二分公共子串长度给后缀数组分组。 然后 check,每一组中是否所有的字符串都包含。 直接遍历 sa 数组,第一个满足的结果
阅读全文
摘要:传送门 数据小的话贪心就行。 可以把这个串翻转再接到后面,再求后缀数组,求出 rank 数组就很简单了。 ——代码 1 #include <cstdio> 2 #include <iostream> 3 #define N 60001 4 5 int n, len, m = 256, sum; 6
阅读全文
摘要:传送门 求出现超过1次的不重叠子串的个数 根据论文中的方法。 枚举子串的长度 k。 用 k 给 height 数组分组,每一组求解,看看当前组的位置最靠后的后缀和位置最靠前的后缀所差个数是否大于长度,大于的话 ans++。 分组思想需要认真体会一下。 ——代码 1 #include <cstdio>
阅读全文
摘要:传送门 求两个串的公共子串(注意,这个公共子串是连续的一段) 把两个串连在一起,中间再加上一个原字符串中不存在的字符,避免过度匹配。 求一遍height,再从height中找满足条件的最大值即可。 为什么只需要相邻两字典序的后缀呢?因为字典序相邻公共前缀一定最大。 ——代码 1 #include <
阅读全文
摘要:传送门 算是个模板。 题目说循环,那就再复制一串拼接上。 然后求后缀数组,再搞就可以。 虽然是求后缀,会在后面多一些字符串,然而题目中说的是循环一圈,但是没有影响。 ——代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream>
阅读全文
摘要:模板题 蒙蔽,先背着,说不定哪天就开窍了。 半年后,真的自己开不了窍,还是得有人讲才能明白些。 于是我先记录一下我对于后缀数组的理解吧。 算了还是写在代码注释中吧。。。 我后悔了,写在代码中之后复制过来会乱码,贴张图片吧。 ——代码 有关后缀数组的讲解
阅读全文
摘要:传送门 n <= 20 很小 所以可以状态压缩 然后因为可能存在环,所以不能DP 那么就用spfa找最短路 被位运算坑了,不清楚优先级一定要加括号 ——代码 1 #include <queue> 2 #include <cstdio> 3 #include <cstring> 4 #include
阅读全文
摘要:传送门 模型 网络优化问题,用最小费用最大流解决。 实现 把每天分为二分图两个集合中的顶点Xi,Yi,建立附加源S汇T。 1、从S向每个Xi连一条容量为ri,费用为0的有向边。 2、从每个Yi向T连一条容量为ri,费用为0的有向边。 3、从S向每个Yi连一条容量为无穷大,费用为p的有向边。 4、从每
阅读全文
摘要:传送门 模型 二分图多重匹配问题,可以用最大流解决。 实现 建立二分图,每个单位为X集合中的顶点,每个餐桌为Y集合中的顶点,增设附加源S和汇T。 1、从S向每个Xi顶点连接一条容量为该单位人数的有向边。 2、从每个Yi顶点向T连接一条容量为该餐桌容量的有向边。 3、X集合中每个顶点向Y集合中每个顶点
阅读全文
摘要:传送门 模型 求最长两条不相交路径,用最大费用最大流解决。 实现 为了限制经过次数,将每个点i拆成xi,yi. 1、从xi向yi连一条容量为1,费用为1的有向边(1<i<N), 2、从x1向y1连一条容量为2,费用为1的有向边, 3、从xN向yN连一条容量为2,费用为1的有向边, 4、如果存在边(i
阅读全文
摘要:传送门 引入两个概念: 最小点权覆盖集:满足每一条边的两个端点至少选一个的最小权点集。 最大点权独立集:满足每一条边的两个端点最多选一个的最大权点集。 现在对网格染色,使得相邻两点颜色不同,之后把两个颜色的点分成两个集合X,Y。S向X集合每个点连一条该点权值的边,Y集合每个点向T连一条该点权值的边,
阅读全文
摘要:传送门 每个类别和它所有的试题连一条权值为1的边。 增加一个超级源点s,s和每个类别连一条权值为选当前类别数量的边。 增加一个超级汇点t,每个试题和t连一条权值为1的边。 求最大流即可。 ——代码 1 #include <queue> 2 #include <cstdio> 3 #include <
阅读全文
摘要:传送门 题解来自网络流24题: 【问题分析】 第一问时LIS,动态规划求解,第二问和第三问用网络最大流解决。 【建模方法】 首先动态规划求出F[i],表示以第i位为开头的最长上升序列的长度,求出最长上升序列长度K。 1、把序列每位i拆成两个点<i.a>和<i.b>,从<i.a>到<i.b>连接一条容
阅读全文
摘要:传送门 枚举球的个数 num 如果 i < j && (i + j) 是完全平方数,那么 i -> j' 连一条边 再加一个超级源点 s,s -> i 再加一个超级汇点 t,i' -> t 那么当前可以放的柱子的最小数量就是最小不相交路径数 如果当前的最小不相交路径数 > num,break 求最大
阅读全文
摘要:传送门 可惜洛谷上没有special judge,不然用匈牙利也可以过的,因为匈牙利在增广上有一个顺序问题,所以没有special judge就过不了了。 好在这个题的测试数据比较特殊,如果是网络流的话按照顺序加边,就可以过。 最小不相交路径覆盖 = 总点数 - 最大匹配数 ——代码 1 #incl
阅读全文
摘要:传送门 如果将每一个实验和其所对的仪器连一条有向边,那么原图就是一个dag图(有向无环) 每一个点都有一个点权,实验为收益(正数),仪器为花费(负数)。 那么接下来可以引出闭合图的概念了。 闭合图是原图的一个点集,其中这个点集中每个点的出边所指向的点依然在这个点集中,那么这个点集就是个闭合图。 比如
阅读全文
摘要:最小割=最大流 最大权闭合图=正权边之和-最小割 听说这24个题很好。 开始填坑吧。 1.飞行员配对方案问题 二分图最大匹配 传送门 (好像就是个模板呀) 2.太空飞行计划问题 最大权闭合图 传送门 3.最小路径覆盖问题 最小不相交路径覆盖 传送门 (这个,也不难) 4.魔术球问题 最小不相交路径覆
阅读全文