05 2017 档案
摘要:传送门 暴力做法 50 ~ 60 枚举删边,求最大路径长度的最小值。 其中最大路径长度运用到了lca 我们发现,求lca的过程已经不能优化了,那么看看枚举删边的过程能不能优化。 先把边按照权值排序,然后。。。 然而并没有什么卵用。 题解给出了一种二分 二分答案。 判断依据: 比当前答案大的路径长度如
阅读全文
摘要:传送门 f[i][j] 表示第一串前 i 个到第二串前 j 个的最小编辑距离 f[i][j] = f[i - 1][j - 1] (s1[i] == s2[j]) f[i][j] = min(f[i - 1][j], f[i][j - 1], f[i - 1][j - 1]) (s1[i] != s
阅读全文
摘要:传送门 f[i][j] 表示区间 i 到 j 变为回文串所需最小费用 1.s[i] == s[j] f[i][j] = f[i + 1][j - 1] 2.s[i] != s[j] f[i][j] = min(f[i + 1][j] + cost[s[i]], f[i][j - 1] + cost[
阅读全文
摘要:传送门 说要统计方案,感觉就是个 Σ 而矩阵中只有 01 ,可以用二进制表示 这样,预处理出每一个每一行所有可能的状态 s 然后初始化第一行所有状态的方案数为 1 f[i][j] = Σf[i - 1][k] (k 和 j 不冲突,j 为第 i 行所有方案,k 为第 i - 1 行所有方案) ——代
阅读全文
摘要:传送门 先按照起点 sort 一遍。 这样每一个点的只由前面的点决定。 f[i][j] 表示终点为 i,花费 j 的最优解 状态转移就是一个01背包。 ——代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #inc
阅读全文
摘要:传送门 二位前缀和DP大水题 ——代码 1 #include <cstdio> 2 #include <iostream> 3 4 const int MAXN = 5010; 5 int n, r, ans; 6 int sum[MAXN][MAXN]; 7 8 inline int read()
阅读全文
摘要:传送门 想了个4次方算法,没想到也A了,数据真是水。 其实两个字符串匹配那部分可以用kmp优化 ——代码 1 #include <cstdio> 2 #include <cstring> 3 4 int n, m, f[310]; 5 char s[310], a[501][310]; 6 7 in
阅读全文
摘要:传送门 f[i][S] 表示当前集合为 S,最后一个数为 i 的最优解 f[i][S] += f[j][S - i] (j, i ∈ S && j != i && abs(a[i] - a[j]) > k) ——代码 1 #include <cstdio> 2 #include <iostream>
阅读全文
摘要:传送门 树上前缀和。 在树上找一条权值和为 s 的链,其中这个链上的点按深度递增(递减)(不同) dfs 每搜到一个点求它的前缀和 sum[x],放入 set 中。 在 set 中找 sum[x] - s 的点,如果有,ans++ 退出 dfs 的时候再把 sum[x] 从 set 中删除 因为每个
阅读全文
摘要:传送门 输出被阉割了。 只输出最少分的组数即可。 f 数组为结构体 f[S].cnt 表示集合 S 最少的分组数 f[S].v 表示集合 S 最少分组数下当前组所用的最少容量 f[S] = min(f[S], f[S - i] + a[i]) (i ∈ S) 运算重载一下即可。 ——代码 1 #in
阅读全文
摘要:传送门 二位费用背包 ——代码 1 #include <cstdio> 2 #include <iostream> 3 4 int n, maxv, maxw; 5 int f[410][410]; 6 7 inline int read() 8 { 9 int x = 0, f = 1; 10 c
阅读全文
摘要:传送门 深搜加剪纸可A(O(玄学) 1274ms) ——代码 1 #include <cmath> 2 #include <cstdio> 3 #include <iostream> 4 5 int n; 6 double ans = ~(1 << 31), a[16], b[16]; 7 bool
阅读全文
摘要:传送门 这个题类似于建筑抢修。 先按照时间排序。 如果当前时间小于任务截止时间就选, 否则,看看当前任务价值是否比已选的任务的最小价值大, 如果是,就替换。 可以用优先队列。 ——代码 1 #include <queue> 2 #include <cstdio> 3 #include <iostre
阅读全文
摘要:传送门 经典问题。 找出最大的不包含 1 的正方形。 f[i][j] 表示 以 (i,j) 结尾的最大的不包含 1 的正方形 f[i][j] = min(f[i - 1][j], f[i][j - 1], f[i - 1][j - 1]) + 1 画个图意会一下 ——代码 1 #include <c
阅读全文
摘要:传送门 简单贪心 ——代码 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 5 int n, l, r; 6 struct node 7 { 8 int x, y; 9 }p[50001]; 10 11 inlin
阅读全文
摘要:传送门 由于 Di 只有 3 种情况,那么就很简单了 f[i][j][0] 表示前 i 个,且第 i 个变成 j 的 递增序列最小修改次数 f[i][j][1] 表示前 i 个,且第 i 个变成 j 的 递减序列最小修改次数 状态转移看代码。 ——代码 1 #include <cstdio> 2 #
阅读全文
摘要:传送门 f[i] 表示送前 i 头牛过去再回来的最短时间 f[i] = min(f[i], f[j] + sum[i - j] + m) (0 <= j < i) ——代码 1 #include <cstdio> 2 #include <iostream> 3 4 const int MAXN =
阅读全文
摘要:传送门 按价格排序后贪心 ——代码 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 5 int n; 6 long long m, ans; 7 struct node 8 { 9 long long x, y;
阅读全文
摘要:传送门 f[i] 表示前 i 个字符去掉多少个 的最优解 直接暴力DP ——代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 5 int n, m, cnt, f[301]; 6 char s[301], a[60
阅读全文
摘要:传送门 转化成 lis 后 n2 搞就行 ——代码 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 5 int n, max, ans; 6 int f[10001]; 7 struct node 8 { 9 in
阅读全文
摘要:传送门 只有第一个,第二个权限题。 分块,然而wa,没看出来错在哪里,有时间再看。 1 #include <cmath> 2 #include <cstdio> 3 #include <iostream> 4 #include <algorithm> 5 6 const int N = 10001,
阅读全文
摘要:是时候结束这个局面了。。 说真的,有了模板一切都好说。 A+B 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 5 using namespace std; 6 7 const int MAXN = 10001; 8
阅读全文
摘要:传送门 单调栈大水题 l[i] 表示 i 能扩展到的左边 r[i] 表示 i 能扩展到的右边 ——代码 1 #include <cstdio> 2 #include <iostream> 3 #define LL long long 4 5 const int MAXN = 2000002; 6 i
阅读全文
摘要:传送门 有向图,找点数大于1的强连通分量个数 ——代码 1 #include <stack> 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 6 const int MAXN = 50001; 7 int n, m,
阅读全文
摘要:传送门 首先,把A和B两个序列分别从小到大排序,变成两个有序队列。这样,从A和B中各任取一个数相加得到N2个和,可以把这些和看成形成了n个有序表/队列: A[1]+B[1] <= A[1]+B[2] <= … <= A[1]+B[N] A[2]+B[1] <= A[2]+B[2] <= … <= A
阅读全文
摘要:传送门 以 去掉多少个 为阶段不好做。 去掉 k 个也可以变成选 n - k 个 f[i][j] 表示前 i 个数中 选 j 个的最优解,a[i] 必选 f[i][j] = min(f[i][j], f[k][j - 1] + abs(b[k] - b[i])) (2 <= j <= min(i,
阅读全文
摘要:传送门 幼儿园DP。 ——代码 1 #include <cstdio> 2 #include <iostream> 3 4 const int MAXN = 2001; 5 int n, m, ans = ~(1 << 31); 6 int a[MAXN][MAXN], f[MAXN][MAXN];
阅读全文
摘要:传送门 和奶牛那个题很像,每一行状态互不影响,也就是求 n 遍DP 不过高精度非常恶心,第一次写,调了我一上午。 ——代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 5 struct Big_int 6 { 7
阅读全文
摘要:传送门 f[i][j][k] 表示 左右两段取到 i .... j 时,取 k 次的最优解 可以优化 k 其实等于 n - j + i 则 f[i][j] = max(f[i + 1][j] + a[i] * (n - j + i), f[i][j - 1] + a[j] * (n - j + i)
阅读全文
摘要:传送门 动归,用f[i][j]表示到达第I列高度为j时最少需要飞的次数,容易想到最裸的转移: f[i][j]=min(min(f[i-1][j-up[i-1]*k]+k),f[i-1][j+down[i-1]]) 但是会超时 考虑怎么优化k的循环,发现k可以从k-1转移过来,从图上来理解就是比如k=
阅读全文
摘要:传送门 又是个模拟水题,考虑边界就好,连long long都不用开。 ——代码 1 #include <cstdio> 2 #include <iostream> 3 4 int n, d, ans, max; 5 int a[201][201]; 6 7 inline int read() 8 {
阅读全文
摘要:传送门 距离为2的点会产生权值,第一问,只需要在dfs的时候把一个点相邻的点都处理出来就行。 具体处理方式看代码,然而这样只处理了一遍,最后在乘2就好了。 第二问只需要处理一个点相邻的点中最大的和次大的就行。 ——代码 1 #include <cstdio> 2 #include <cstring>
阅读全文
摘要:传送门 虽然是模拟,但是我们可以用矩阵保存结果,来是其更加简便。 ——代码 1 #include <cstdio> 2 #include <iostream> 3 4 int map[5][5] = {{0, 0, 1, 1, 0}, 5 {1, 0, 0, 1, 0}, 6 {0, 1, 0, 0
阅读全文
摘要:noip2013年的题考了300分 才发现出现了好多问题。 比如,不能想当然,还是得仔细思考题目,还有,样例都是太水,得多测几组。 各种需要注意的细节,比如 i >= 1 可以直接用 i 代替,而 i >= 0 就呵呵了。 还有最重要的一件事,不要用系统保留字。 noip的知识点学得差不多了,感觉可
阅读全文
摘要:传送门 n2 过不了惨啊 70分做法 f[i][0] 表示第 i 个作为高的,的最优解 f[i][0] 表示第 i 个作为低的,的最优解 (且第 i 个一定选) 那么 f[i+1][1]=max(f[j][0])+1,i>=j>=1,h[j]>h[i+1], f[i+1][0]=max(f[j][1
阅读全文
摘要:传送门 用dijkstra比较好,spfa可能有的重复 dis[x][2]:dis[x][0]表示起点到x的最短路、dis[x][1]表示起点到x的次短路; tot[x][2]:tot[x][0]表示起点到x的最短路条数、tot[x][1]表示起点到x的次短路的条数; vis[x][2]对应于x和0
阅读全文
摘要:传送门 真是诡异。 首先 O(n * 100 * 100) 三重循环 f[i][j] 表示到第 i 个柱子,高度是 j 的最小花费 f[i][j] = min(f[i - 1][k] + abs(k - j) * c + (j - a[j]) * (j - a[j]) (1 <= k <= 100)
阅读全文
摘要:传送门 个数 1 2 3 4 5 答案 1 4 9 16 25 做差 1 3 5 7 9 显然增加一个数只需要增加 ton[a[x]] << 1 | 1 即可 减去一个数也减去这个 注意先加减再更新 ton ——代码 1 #include <cmath> 2 #include <cstdio> 3
阅读全文
摘要:传送门 莫队基础题,适合我这种初学者。 莫队是离线算法,通常不带修改,时间复杂度为 O(n√n) 我们要先保证通过 [ l , r ] 求得 [ l , r + 1 ] , [ l , r - 1 ] , [ l - 1 , r ] , [ l + 1 , r ] 的效率是O(1)的 对于莫队的理解
阅读全文
摘要:传送门 BZOJ上是权限题,洛谷赞啊。 求区间 K 大数很简单。 但是如果修改某个数的话,那么就得把这个数及后面所建的主席树都更新一遍 nlogn,显然不行。 所以可以在外面套一个树状数组来优化,树状数组的每一个节点都表示某个区间的主席树。 所以可以通过树状数组来求前缀和主席树。 具体实现看代码。
阅读全文
摘要:传送门 看到这个题有个很暴力的想法, 可以每一个时间点都建一颗主席树,主席树上叶子节点 i 表示优先级为 i 的任务有多少个。 当 x 到 y 有个优先级为 k 的任务时,循环 x 到 y 的每个点,都插入一个 k。 当然这样肯定完蛋。 x 到 y 插入一个优先级为 k 的任务? 想到差分,给时间点
阅读全文
摘要:传送门 至少BZOJ过了,其他的直接弃。 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查询k在区间内的前驱(前驱定义为小于x,且最大的数) 5.查询k在区间内的后继(后继定义为
阅读全文
摘要:传送门 支持操作: 1.区间加 2.区间翻转 3.区间求最大值 splay模板 注意:update 里更新 max 时需要取 3 个值的 Max 别忘了各种边界讨论 ——代码 1 #include <cstdio> 2 #define ls son[now][0] 3 #define rs son[
阅读全文
摘要:传送门 很蒙蔽,不知道怎么搞。 网上看题解有说可以哈希+二分搞,也有的人说用Manacher搞,Manacher是什么鬼?以后再学。 对于这个题,可以从矩阵4个角hash一遍,然后枚举矩阵中的点,再二分半径。 但是得考虑边的长度为奇偶所带来的影响。 比如 1 1 1 1 这个边数为偶数的矩阵显然没法
阅读全文
摘要:传送门 二维哈希即可。 注意质数选的大一些,不然会超时。 还有插入的时候不判重居然比判重要快。。 ——代码 1 #include <cstdio> 2 int main() 3 { 4 int i = 10; 5 while(i--) puts("1"); 6 return 0; 7 } O不,错了
阅读全文
摘要:传送门 比 P1439 排列LCS问题,难那么一点点,只不过有的元素不是两个串都有,还有数据范围变大,树状数组得打离散化。 不过如果用栈+二分的话还是一样的。 ——代码 1 #include <cstdio> 2 #include <algorithm> 3 4 const int MAXN = 3
阅读全文
摘要:传送门 网上说这是偏序集最大反链,然而我实在不理解。 所以我换了一个思路,先用floyd,根据点的连通性连边, 问题就转换成了找出最多的点,使任意两个点之间不连边,也就是最大独立集。 ——代码 1 #include <cstdio> 2 #include <cstring> 3 #include <
阅读全文
摘要:传送门 题意 N个点M条边的有向图 每个点有点权 从某一个结点出发 问能获得的最大点权和 一个点的点权最多被计算一次 N<=500000 M<=500000 思路 先tarjan缩点,然后就形成一个dag,无环,所以直接spfa求最长路就行。 也可以先缩点,然后拓扑排序 + dp 搞。 代码 1 #
阅读全文
摘要:传送门 就是个单调队列+DP嘛。 ——代码 1 #include <cstdio> 2 3 const int MAXN = 1000001; 4 int n, m, h = 1, t = 1, ans = ~(1 << 31); 5 int q[MAXN], a[MAXN], f[MAXN]; 6
阅读全文
摘要:传送门 这种水题没必要搞线段树了,单调队列就行啊。 ——代码 1 #include <cstdio> 2 3 const int MAXN = 2000001; 4 int n, m, h = 1, t = 1; 5 int a[MAXN], q[MAXN]; 6 7 int main() 8 {
阅读全文
摘要:传送门 团队里的hash水题,数据小的不用hash都能过。。 也就是前缀hash,后缀hash,再比较一下就行。 ——代码 1 #include <cstdio> 2 #include <cstring> 3 #define ULL unsigned long long 4 5 int n, m,
阅读全文
摘要:传送门 看着很吓人,其实就是个树链剖分模板。 可支持操作: 1.将节点 x 到 根 的路径上的值都变成 1 2.将以节点 x 为根的子树的值都变成 0 1A爽~ ——代码 1 #include <cmath> 2 #include <cstdio> 3 #include <cstring> 4 #i
阅读全文
摘要:传送门 可以枚举被删除的位置,然后用hash表判重,然而网上好多题解都是用 sort 判重的。 不知道为什么,int 总是过不了,换成 long long 或者是 unsigned long long 就过了 QAQ ——代码 1 #include <cstdio> 2 #include <cstr
阅读全文
摘要:传送门 k <= 109 暴力肯定超时 根据矩阵性质,可以发现 S(4) = A1 + A2 + A2 * (A1 + A2) S(5) = A1 + A2 + A2 * (A1 + A2) + A5 所以可以递归二分求解,分别判断 Ak,k 为奇数和偶数的情况 ——代码 1 #include <c
阅读全文
摘要:向量满足一些与加法和乘法相关的结合律、交换律、分配律等,矩阵也满足某些定律,它们是: (1)A + B = B + A(加法交换律) (2)A + (B + C) = (A + B) + C(加法结合律) (3)A*(B*C) = (A*B)*C(乘法结合律) (4)A*(B + C) = A*B
阅读全文
摘要:传送门 解析详见julao博客连接 http://worldframe.top/2017/05/10/清单-数学方法-——-矩阵/ ——代码 1 #include <cstdio> 2 #include <cstring> 3 #define LL long long 4 5 LL n; 6 con
阅读全文
摘要:传送门 模板不解释。 ——代码 1 #include <cstdio> 2 #include <cstring> 3 #define LL long long 4 5 int n; 6 LL k; 7 const int p = 1e9 + 7; 8 9 struct Matrix 10 { 11
阅读全文
摘要:原文链接 http://www.cnblogs.com/liu-runda/p/6193690.html DP(Dynamic Programming):一种以无后效性的状态转移为基础的算法,我们可以将其不严谨地先理解为递推。例如斐波那契数列的递推求法可以不严谨地认为是DP。当然DP的状态也可以是二
阅读全文
摘要:传送门 有点类似LCS,可以把 a[i] 在 b 串中的位置用一个链式前向星串起来,由于链式前向星是从后往前遍历,所以可以直接搞。 状态转移方程 f[i] = max(f[j]) + 1 ( 1 <= j < i && a[i] == b[j] ) ——代码 1 #include <cstdio>
阅读全文
摘要:传送门 无重复元素的LCS问题 n2 做法不说了。 nlogn 做法 —— 因为LCS问题求的是公共子序列,顺序不影响答案,影响答案的只是两个串的元素是否相同,所以可以交换元素位置。 首先简化一下问题,假设P1恰好为单调递增的1,2,3,...n,那么很显然答案就是P2的最长上升子序列的长度 问题是
阅读全文
摘要:传送门 DP方程 f[i] = f[j] + (a[j] <= a[i]) ( i - k < j < i ) 要使 f[i] 最小,需要等号后面的值最小,可以用单调队列来维护。 至于如何维护,具体看代码。 ——代码 1 #include <cstdio> 2 3 const int MAXN =
阅读全文
摘要:传送门 题意 给出一棵树,求离每个节点最远的点的距离 思路 对于我这种菜鸡,真是难啊。 每个点的距离它最远的点,除了在它子树中的,还有在它子树之外的,所以这几个状态都得表示出来。 我们能够很简单的求出每个点到以它为根的子树的最远点的距离,dfs 即可。 设 f[i][0] 表示点 i 到以它为根的子
阅读全文
摘要:传送门 f[i][j] 表示前 i 种花,摆 j 盆的方案数 j f[i][j] = Σ f[i - 1][j] k=max(0, j - a[i]) 博客园这个公式该怎么打啊。。 ——代码(本渣太菜,和公式有些不同) 1 #include <cstdio> 2 3 int n, m, p = 10
阅读全文
摘要:传送门 f[i][j] 表示第 1 个串匹配到第 i 位,第 2 个串匹配到第 j 位的答案。 f[i][j] = max(f[i - 1][j], f[i][j - 1]) (a[i] != b[j]) f[i][j] = max(f[i - 1][j], f[i][j - 1], f[i - 1
阅读全文
摘要:传送门 把数据存在结构体中,至于怎么贪心? 肯定会有些想法,正确错误先不必说,先来试一试。 1.按照 t2 为第一关键字从小到大排,按照 t1 为第二关键字从小到大排 这个显然错,比如后面有个数的 t1 比前面小,t2 比前面大,显然用这个代替前面的更优 2.按照 t1 为第一关键字从小到大排,按照
阅读全文
摘要:传送门 n = A % 9973 -> n = A - A / 9973 * 9973 设 x = A / B(题目所述,B|A) -> A = B * x 所以 B * x - A / 9973 * 9973 = n 设 y = A / 9973 则 B * x - 9973 * y = n B
阅读全文
摘要:传送门 题意 给出若干个数n(n<=1000000),求每个n的最大质因子的排名。 质数的排名:如果素数p是第k小的素数,那么p的排名就是k。 给出若干个数n(n<=1000000),求每个n的最大质因子的排名。 质数的排名:如果素数p是第k小的素数,那么p的排名就是k。 思路 乍一看不知道怎么搞。
阅读全文
摘要:传送门 ax≡1(mod b) 这个式子就是 a * x % b == 1 % b 相当于 a * x - b * y == 1 只有当 gcd(a,b) == 1 时才有解,也就是说 ax + by = c 有解的充要条件是 c % gcd(a,b) == 0 一般,我们能够找到无数组解满足条件,
阅读全文
摘要:dalao博客,至少很好看。。 因为本人数论实在渣渣,但是考试确是得考的,只好尽早学,尽早掌握。 最大公因数 普通gcd O(log(min(a,b))) 1 inline int gcd(int x,int y) 2 { 3 return y == 0 ? x : gcd(y, x % y) 4
阅读全文
摘要:传送门 先把所有串建一个AC自动机, 如果要找一个不包含任意一个串的串, 说明这个串一直在AC自动机上匹配但匹配不到, 也就是说,匹配时除去val值为1的点,除去fail指针指向val值为1的点,是否有环,dfs即可。 因为val值为1说明匹配上,fail指针指向的点x,根到x所形成的字符串是当前串
阅读全文
摘要:传送门 不停的枚举 l ,然后枚举长度,直到所有颜色都包含,这是 n2 做法,超时。 仔细想想,可以用个队列来维护。 还是枚举 l ,用队列来维护当前区间的包含所有颜色,l 增加时再判断。 ——代码 1 # include <iostream> 2 # include <cstdio> 3 # in
阅读全文
摘要:传送门 这个题显然可以用树链剖分做。 然而线段树也能做。 每个点都对它的子树有贡献,所以先求一边 dfs序,然后直接在 dfs序 中搞 线段树 就行。 ——代码 1 #include <cstdio> 2 #include <cstring> 3 #define root 1, 1, n 4 #de
阅读全文
摘要:传送门 用两个树状数组,cr 维护 1....x 中 r 的数量 cl 维护 1....x 中 l 的数量 求答案的时候只需要求 y 前面 被作为左端点 的个数 - x 前面 被作为右端点的个数 ——代码 1 #include <cstdio> 2 3 using namespace std; 4
阅读全文
摘要:luogu P3374 【模板】树状数组 1 在大牛分站交能过,主站卡常。 时间复杂度为 n√n ≈ 3.5 * 108,我都不知道怎么过的。。 ——代码 1 #include <cmath> 2 #include <cstdio> 3 #include <iostream> 4 5 using n
阅读全文
摘要:传送门 以为对于这类问题线段树都能解决,分块比线段树菜,结果培训完才知道线段树是一种特殊的分块方法,有的分块的题线段树不能做,看来分块还是有必要学的。 对于这个题,先分块,然后另开一个数组对于每个块内排序。 区间加的话,加一个标记,每一个整块区间加,里面的数的相对大小不变,而左右两边零散的块直接暴力
阅读全文
摘要:传送门 把线段都读进来然后排序,先按右端点为第一关键字从小到大排序,后按左端点为第二关键字从小到大排序。 注意不能先按左端点后按右端点排序,否则会出现大包小的情况,如下: —————— ——— — 然后直接线段树搞就行,先求区间最小值,如果大于零就更新统一减1。 ——代码 1 #include <c
阅读全文
摘要:传送门 设 f[i] 表示吃完 f[i] 及其以下的能量球后所剩下的能量。 所以 f[i] = max(f[i], f[j] + (sum[i] - sum[j]) - i * 100) ( 0 <= j < i ) 但这是 O(n2) 的,肯定超时, 把上面的式子变换以下得到 f[i] = max
阅读全文
摘要:传送门 1.先弄个单调队列求出每一行的区间为n的最大值最小值。 2.然后再搞个单调队列求1所求出的结果的区间为n的最大值最小值 3.最后扫一遍就行 懒得画图,自己体会吧。 ——代码 1 #include <cstdio> 2 #include <iostream> 3 4 using namespa
阅读全文
摘要:传送门 首先考虑暴力做法,可以先求一遍前缀和 sum,然后ans = max(ans, sum[i] - sum[k]) (i - q <= k <= i - p) 但这个肯定会超时。 仔细看这个公式,sum[i] 不变,只用求最小 sum[k] 就行,所以可以用单调队列维护这个区间的最小 sum[
阅读全文
摘要:传送门 和玉蟾宫差不多 ——代码 1 #include <cstdio> 2 #include <iostream> 3 4 using namespace std; 5 6 const int MAXN = 2001; 7 int n, m, ans1, ans2, top; 8 int a[MA
阅读全文
摘要:传送门 题目 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。这片土地被分成N*M个格子,每个格子里写着’R’或者’F’,R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda。现在fr
阅读全文
摘要:传送门 题意: 给一个N*N的矩阵,有些格子有障碍,要求我们消除这些障碍,问每次消除一行或一列的障碍,最少要几次。 解析: 把每一行与每一列当做二分图两边的点。 某格子有障碍,则对应行与列连边。 选出最少的点,使得所有边被覆盖。 最小点覆盖。 ——代码 1 #include <cstdio> 2 #
阅读全文
摘要:传送门 引子: 有一个问题,是对于一个图上的所有点,用不相交的路径把他们覆盖,使得每个点有且仅属于一条路径,且这个路径数量尽量小。 对于这个问题可以把直接有边相连的两点 x —> y,建一个二分图 x' —> y,最后 节点数 - 最大匹配数 即为最终答案。 这才是题解: 但是这个题目不同,此题问的
阅读全文
摘要:传送门 把所有非障碍的相邻格子彼此连一条边,然后求二分图最大匹配,看 tot * 2 + k 是否等于 n * m 即可。 但是连边不能重复,比如 a 格子 和 b 格子 相邻,不能 a 连 b ,b 也连 a。 所以可以人为规定,横纵坐标相加为 奇数 的格子连横纵坐标相加为 偶数 的格子。 如果一
阅读全文
摘要:传送门 因为到某一没有限速的路径速度会有不同的可能,所以直接用 dis[i][j] 表示到第 i 个点速度为 j 时的最短时间,然后跑spfa。 ——代码 1 #include <queue> 2 #include <cstdio> 3 #include <cstring> 4 5 using na
阅读全文
摘要:传送门 因为要随机删除一条边,而枚举所有边肯定会超时,经过发现,先求出一遍最短路,而要删除的边肯定在最短路径上,删除其他的边对最短路没有影响。 所以可以先求出最短路,再枚举删除最短路上的每一条边再求最短路。 ——代码 1 #include <queue> 2 #include <cstdio> 3
阅读全文
摘要:传送门 建图麻烦,建完图搞一遍Floyd就好了。 ——代码 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 5 using namespace std; 6 7 int n, s, a, b; 8 int t, x[401
阅读全文
摘要:传送门 基于Floyd的动态规划原理,我们可以只用进行一次Floyd。 而题目给出的限制条件相当于给Floyd加了时间限制而已。 还是得靠对Floyd的理解。 ——代码 1 #include <cstdio> 2 #include <iostream> 3 4 using namespace std
阅读全文
摘要:传送门 1.最大生成树 可以求出最大生成树,其中权值最小的边即为答案。 2.最短路 只需改变spfa里面的松弛操作就可以求出答案。 ——代码 1 #include <queue> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace
阅读全文
摘要:传送门 来自题解:https://www.luogu.org/wiki/show?name=题解+P3385 1.Bellman-Ford 通过Belman-Ford求出最短路,然后在进行一遍松弛操作,如果可以再松弛说明存在负环,否则不存在。 2.SPFA SPFA有两种实现方法。一个是BFS一个是
阅读全文
摘要:传送门 树链剖分固然可以搞。 但还有另一种做法,可以看出,增加一个节点的权值会对以它为根的整棵子树都有影响,相当于给整棵子树增加一个值。 而给以某一节点 x 为根的子树增加一个权值也会影响当前子树,节点 y 所增加的值为 dis[y] * z - (dis[x] - 1) * z,每个节点都会增加
阅读全文
摘要:传送门 需要把一条路径上除了终点外的所有数都 + 1, 比如,给路径 s - t 上的权值 + 1,可以先求 x = lca(s,t) 类似数列上差分的思路,可以给 s 和 f[t] 的权值 + 1,给 x 和 f[x] 的权值 - 1 最后统计以每个节点为根的子树的和,则每个节点的权值就是子树的权
阅读全文
摘要:传送门 可以看出,三个点两两之间的lca会有一对相同,而另一个lca就是聚集点。 然后搞搞就可以求出距离了。 ——代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define MAXN 1000001 5 6
阅读全文
摘要:传送门 水题。 直接倍增求lca。 x到y的距离为dis[x] + dis[y] - 2 * dis[lca(x, y)] ——代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define MAXN 20002
阅读全文
摘要:传送门 树上的dp,从底向上dp就行。 设dp[u][0]表示不选节点 u 的最大值,dp[u][1]表示选节点 u 的最大值。 则状态转移方程为: dp[u][0] = ∑max(dp[v][1], dp[v][0]) dp[u][1] = ∑dp[v][0] + val[u] (节点v是节点u的
阅读全文
摘要:传送门 因为异或满足结合律和交换律。 a^b^b=a 所以这个题直接求根节点到每个点路径上的异或值。 对于每组询问直接输出根到两个点的异或值的异或的值。 ——代码 1 #include <cstdio> 2 #include <cstring> 3 #define MAXN 200001 4 5 u
阅读全文
摘要:部分转载自:http://blog.csdn.net/u013076044/article/details/45915745 定义 找到一个点,其所有子树中最大的子树节点数最少,那么这个点就是整棵树的重心。 在树的总点数为偶数时,可能会有两个重心。 性质 性质 1 :树中所有点到某个点的距离和中,到
阅读全文
摘要:传送门 假设数据再大些,我这就是正解,然而题解里总是各种水过。 两边dfs,一遍求重心,一遍统计距离。 ——代码 1 #include <cstdio> 2 #include <cstring> 3 #define MAXN 1001 4 5 using namespace std; 6 7 int
阅读全文
摘要:清北澡堂七日游 %%%hzh hzh大佬,不知为何一点印象都没有。 hzh大佬在水群 只记得hzh讲了些图和树,还剩下一个基友环树没讲,说这玩意没什么卵用,就是用来增加代码量的。 %%%lzh dalao发音很有意思。 受欢迎的liu 时间cuo 好像也是讲的图论,lca之类的,树剖求lca,二分图
阅读全文
摘要:传送门 直接搞就行。 注意下表re从零开始,而树状数组搞不了0,所以统一增加一个偏移量1. (话说数据随机是什么鬼?) 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <string> 5 #
阅读全文
摘要:传送门 当然可以用队列来搞啦。 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <string> 5 # include <cmath> 6 # include <vector> 7 # in
阅读全文
摘要:传送门 可以搞2个单调队列。 然后,然后就没有然后了。 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <string> 5 # include <cmath> 6 # include <ve
阅读全文
摘要:题目传送门 1.线段树 线段树可以搞。 不过慢的要死1300+ms 1 #include <cstdio> 2 #include <iostream> 3 4 using namespace std; 5 6 int m, n, pos, ql, qr; 7 long long c[2000001]
阅读全文