2019年7月

题意给出一个 $A\times B$ 的矩阵,要求求出一个子矩阵,满足子矩阵中最大值和最小值的差值最大。$A,B\le 1000$ 。题解先对每行用单调队列求出最大/最小值,记录在 $maxx[],minx[]$ 中。然后对这两个数组的每列用单调队列再求出最大/最小值,即可得到答案。#include<bits/stdc++.h> using namespace std; in...
题解 数据结构-单调队列
提高+/省选-
题意多重背包问题。题解单调队列优化多重背包。$$f[i][j] = \max_{k=0}^{num[i]} f[i-1][j-k\times c[i]]+k\times w[i]$$令 $a = j \mod c[i] \ , \ b = \lfloor \dfrac{j}{c[i]} \rfloor $ :$$f[i][j] = \max_{k=b-num[i]}^{b} \{f[i-1]...
题解 动态规划 动态规划-单调队列优化DP
提高+/省选-
题意有 $N$ 个格子,每个格子有权值。最开始每次只能跳 $d$ 格,可以通过改进跳 $d-g..d+g$ 格。求满足能获得最少 $k$ 权值的最小的 $g$ 。$N\le 500000$ 。题解可以对 $g$ 二分答案,然后进行验证。令 $f[i]$ 为前 $i$ 个格子可以获得的最大权值,转移方程式为:$$f[i] = \max_{j=1}^{i-1} f[j]+s[i] \ (d-g\...
题解 动态规划 算法-二分/三分 动态规划-线性DP
提高+/省选-
双倍经验:洛谷2034 选择数字题意从一个数列中选出一些数,要求不能有超过 $k$ 个连续的数,求这些数的最大和。数列长度 $N\le 100000$ 。题解令 $f[i]$ 表示前 $i$ 个数的最优解,$sum[i]$ 表示前缀和,转移方程式为:$$f[i] = \max_{j=i-k}^i f[j-1] + sum[i] - sum[j]$$$$f[i] = \max_{j=i-k}^...
题解 动态规划 动态规划-线性DP 动态规划-单调队列优化DP
提高+/省选-
题意给出一个 $N$ 点 $M$ 边的有向图,令 $1\rightarrow N$ 的最短路长度为 $d$ ,求 $1\rightarrow N$ 的长度不超过 $d+k$ 的路径条数。多组数据。 $N\le 100000$ ,$M\le 200000$ 。题解先跑一次反向最短路,记 $i\rightarrow n$ 的最短路长度为 $dis[i]$ 。用 $d(i,j)$ 表示 $i\ri...
题解 动态规划 动态规划-图上DP
省选/NOI-
题意给出 $N$ 个砝码,每个砝码的质量至少等于前面两个砝码(也就是质量比它小的砝码中质量最大的两个)的质量的和,求能凑出的 $\le C$ 的重量最大值。$N\le 1000,C\le 2^{30}$ 。题解每个砝码的质量至少等于前面两个砝码的质量的和所以 $N\le 30$ 。。。所以爆搜就行了,拿个前缀和优化剪枝,如果剩下的都能取就直接取完。#include<bits/stdc+...
题解 算法-搜索
普及/提高-
题意给出一个加法表,一个字母代表一个数字。求加法的进制,以及每个大写字母代表的数字。数字个数 $N\le 8$ 。(行数 $\le 9$)题解结论:一定是 $N$ 进制。每一行有几个二位数,这个数就是几。证明:因为有 $N$ 个不同的数,所以最少 $N$ 进制。假设为 $N+1$ 进制,那么一定有一个数没有出现,假设为 $k$ 。$k=0$ 或 $k=1$,而 $1+N=10$ ,矛盾。$1...
题解 算法-搜索
提高+/省选-
双倍经验:洛谷2687 逢低吸纳,全部改成 double 就可以水过。题意求最长下降子序列的长度和个数。如果两个序列的值相同,则认为这两个序列相同,只算一个。序列长度 $N\le 5000$ 。题解长度很好求,用 $f[i]$ 表示以 $i$ 结尾的最长下降子序列的长度:$$f[i] = \max_{j=1}^{i-1} f[j]+1 \ (s[j] > s[i]) \tag{1}$...
题解 动态规划 动态规划-线性DP
提高+/省选-
开始爆肝题解题意给出一个 $N$ 进制加法的竖式,一个大写字母代表一个数字。求每个大写字母代表的数字。$N\le 26$ 。题解直接爆搜。从右往左一次搜各个竖排,如果搜到就退出。要开 O2 并且优化搜索顺序(就是把每个竖排的第一个数倒叙搜索,可以通过分析数据点得出)才能过,而且 #9 刚好 $1000ms$ ,真是刺激。#include<bits/stdc++.h> using...
题解 算法-搜索
提高+/省选-
请按顺序阅读常用操作安装Gitsudo apt-get install gitWindows 去下载安装 Git,然后右键选择 Git Bash Here指定用户信息git config --global user.name "<username>" git config --global user.email "<email>"...
笔记
D题没做出来,待补。 补完了A-P5461 赦免战俘题意不停的把矩形左上角的数变成 $0$ ,然后继续分治求解剩下三部分,输出矩形最后的形态。矩形大小为 $2^N\times 2^N$ ,$N\le 10$ 。题解直接按题意模拟即可。#include<bits/stdc++.h> using namespace std; inline int read() { cha...
题解
双倍经验:SP1110题意填一个 $16\times 16$ 的数独。多组数据。题解状压优化搜索+剪枝。用 $16$ 位二进制数 $\text{ok}[i][j]$ 表示每个点可以填字母的情况。每次搜索之前先尽可能找到不合法,或只有一种填法的情况。某个点不能填任何字母则回溯;只能填一个字母则直接向下搜索,搜不到直接退出。某个字母不能填在某一行的任何位置则回溯;只能填在一个位置则向下搜索。列同...
题解 算法-搜索 算法-状态压缩
NOI/NOI+/CTSC
题意在长度为 $N$ 的数列中选择不超过 $M$ 段连续的数,求这些数总和的最大值。$N,M\le 10000$ 。题解可以先将连续的相同符号的数合并起来,并忽略 $0$ 。因为取正数时一定会把一整段取完,取负数也肯定会把自己这段和两边的正数段取完。这样得到的新序列是正负交替的,下面处理新数列。先贪心的把所有正数取完,并记正数的个数为 $cnt$ 。如果 $cnt\le m$ ,那么此时就已...
题解 算法-贪心 数据结构-堆
题意要求维护一个序列,可以动态插入和查询第 $k$ 大。命令总数 $\le 30000$ 。题解用两个堆维护,大根堆大小为 $k-1$ ,其余放入小根堆。插入操作时,先插入大根堆,然后取堆顶放入小根堆。查询操作时,答案就是小根堆顶,并将答案放入大根堆。#include<bits/stdc++.h> using namespace std; inline int read() ...
题解 数据结构-堆
提高+/省选-
题意给出一个矩阵,求该矩阵的最小循环节面积。(不要求恰好完全覆盖)。矩阵大小为 $N\times M$ ,$N\le 10000 \ , \ M\le 75$ 。题解对行和列分别求出 $next[]$ ,答案就是 $(n-next[n])\times (m-next[m])$ 。#include<bits/stdc++.h> using namespace std; inli...
题解 字符串-kmp
标签
其它-Firefox1 其它-pbds1 其它-pjax1 其它-Ubuntu1 其它-VSCode1 其它-网易云音乐1 动态规划52 动态规划-区间DP9 动态规划-单调队列优化DP5 动态规划-图上DP1 动态规划-斜率优化DP5 动态规划-树形DP16 动态规划-状压DP16 动态规划-线性DP10 动态规划-背包DP3 图论4 图论-LCA4 图论-Tarjan11 图论-二分图1 图论-割点3 图论-基环树1 图论-差分约束4 图论-强连通分量2 图论-最小环1 图论-最小生成树6 图论-最短/最长路19 图论-树上差分2 图论-树的直径4 图论-桥1 图论-缩点5 图论-负环4 字符串3 字符串-kmp2 思维题3 数学26 数学-bsgs2 数学-exgcd4 数学-gcd2 数学-中国剩余定理2 数学-卡特兰数1 数学-卢卡斯定理4 数学-快速幂4 数学-扩展中国剩余定理1 数学-扩展卢卡斯定理3 数学-矩阵5 数学-约数1 数学-组合数3 数学-质数1 数据结构-动态开点线段树1 数据结构-单调栈1 数据结构-单调队列2 数据结构-可持久化字典树2 数据结构-堆4 数据结构-字典树2 数据结构-并查集2 数据结构-栈1 数据结构-树状数组6 数据结构-树链剖分10 数据结构-线段树5 数据结构-队列1 比赛-Codeforces21 比赛-JX Round1 比赛-NOIp/CSP5 算法-KM算法1 算法-二分/三分12 算法-位运算1 算法-倍增4 算法-分块2 算法-分治3 算法-哈希2 算法-多叉树转二叉树2 算法-差分4 算法-悬线法1 算法-拓扑排序2 算法-排序3 算法-搜索21 算法-模拟5 算法-状态压缩4 算法-贪心10 算法-高精度3 问题-逆序对2 题目-一本通5 题目-网络流24题2