随笔分类 - 图
摘要:要点 会发现本质上棋盘分成了若干个独立集,本集合内的点放不放棋子并不影响其他集合内的 集合的划分方式就是满棋盘跳马步直到全跳过了,然后每个集合就分成两队,我们选人多的那队放棋子,人少那队当禁区 C++ const int maxn = 1e3 + 5; const int nx[] = { 2, 2
阅读全文
摘要:要点 将边作为染色,如果交叉则异色 C++ include include include using namespace std; int n, m; int a[101], b[101], c[101]; int main() { scanf("%d %d", &n, &m); for (int
阅读全文
摘要:要点 发现每行每列都得有1 发现无论怎么换,在同一行的永远在同一行,同一列的永远在同一列 于是换行貌似没什么用啊,换列就够了。换列无法做到则无答案 于是变成了行与列进行二分匹配 C++ include include int T, n, a[205][205]; int match[205], vi
阅读全文
摘要:要点 序列上各位置之间的关系常用连边的手段转化为图的问题。 经过一番举例探索不难发现当存在两条有向边交叉时是非法的。 1是模糊的,也就是填多少都可以,那为了尽量避免交叉我们贪心地让它后面那个连它就行了。 看到一个很简短的dfs做法。从右向左一探到底,不行时回溯,直到可行后再探。
阅读全文
摘要:逗号空格是假的,全都直接连边就行。 提供一个迪杰n次的图上最小环板子。
阅读全文
摘要:因为公用一个系统所以大家求gcd;衡量各点之间的拓扑位置,如果到达同一点有不同的长度则取gcd。 C++ include include include include using namespace std; const int maxn = 1e5 + 5; int n, m, ans; int
阅读全文
摘要:要点 并没问具体方案,说明很可能不是构造。 思考不断读入这个文本串,然后中间不出现某些文法的串。啊,这就是个自动机。 将不合法串使用ac自动机构成一个Trie图,我们需要的字符串就是在这个自动机上无限走路但是却不会撞到危险节点。 这样只要从根开始跑dfs判有环即存在答案。 注意还要加上ac自动机的性
阅读全文
摘要:要点 非要先来后到暗示多源最短路,求最小的最大值暗示二分 二分内部的check是关键,dp处理一下,$dp[i]$表示第$i$笔订单最早何时送达,如果在ddl之前到不了则$return\ 0$。我觉得其中$time$变量的维护很好地使复杂度降了一维。 第一发WA点:算法看了一遍感觉没有可改的,就把二
阅读全文
摘要:看样例然后发现只要求一个一笔画即可,用板子。 C++ include include include include include using namespace std; const int maxn = 1e5 + 5; int n, b[maxn], c[maxn], _b[maxn], _
阅读全文
摘要:最小平均值的环。二分答案以后根据式子将问题转化为:每条边减去mid后是否存在负环,若全是正环说明ans给小了,存在负环则说明存在一个更小的ans。 get到一个新的判负环手法。
阅读全文
摘要:提交通道 洛谷日报 考虑非$O(n^2)$的预处理。一遍dfs时,check某颜色有没有的数组何时清空很尴尬:得到某树答案后如果不清,则影响接下来兄弟树的搜索;如果清了,父亲节点又难以收集答案。 解决方法:先让儿子们各顾各的家,算一遍各自的答案(假如能算),check清就清了吧。然后考虑人为优化,即
阅读全文
摘要:AC通道 如果建立第一天某点到某点有几条路的矩阵,做k次矩阵乘就是第k天某点到某点有几条路。统计即可。 C++ include using namespace std; typedef long long ll; const int maxn = 101, mod = 1e9 + 7; int N,
阅读全文
摘要:要点 显然要滑动修改维护。 像通常的数列next关系一样建边(单调栈预处理),因为贪心所以是树,然后发现增删只会影响 区间内的 子(or父,看你连边方向行事)节点,于是使用dfs序建线段树。 为了正确地修改,会发现必须得用大数向小数连边。一是根据题意,一个大数会有好几个小数儿子但小数只会贪心选一个父
阅读全文
摘要:Codeforces 1107一题除了dp做法还有二分带权匹配O(n^3)做法,国外网友的板子时间非常优秀,但矩阵设定的事情并不是很懂…… C++ //Codeforces 1107F const int maxn = 505; int n; ll a, b, k, Matrix[maxn][max
阅读全文
摘要:题目传送 做法 对于每个人,inc为x,pref为y;对于每道菜,p和s为x,b为y 于是根据题意有$$p[i] include include include include define rep(i, a, b) for (int i = a; i void read(T &x) { x = 0
阅读全文
摘要:pi只有0~5000且只找最小的没出现的,又要找不同club的,考虑二分匹配,左边pi,右边ci,一个匹配一个。离线倒着加边即可。
阅读全文
摘要:树上每个割点计算一下各个size的组合相乘再相加为第一问答案,取最大的;再把本答案中最大的两个size相乘减掉,为第二问答案。 C++ const int maxn = 1e4 + 5; int n, size[maxn], ans, b; vector adj[maxn]; void dfs(in
阅读全文
摘要:题目传送 官方题解说的很好了,剩下的就是读大佬代码了,前面是tarjan求SCC缩点图。我图论没学过,接下来删点是怎么操作看得有点头秃,直到我看到了%%% 安德鲁何 神仙的代码。 按照题面连通紫线以后,我们姑且先考虑从入度为0的点着手看看是否可行。由于都是入度为0的点,所以现在我们连的都是绿边。 假
阅读全文
摘要:关键点在于:全排列中,任意两点u、v相邻的次数一定是(n - 1)! * 2次,即一个常数(可以由高中数学知识计算,将这两个点捏一起然后全排列然后乘二;或者用n! / C(2, n))。 这之后就好算了,每条边算一下子树size对吧,乘法原理就是贡献次数,乘以边权加一起就行了。 所以不是dfs就行了
阅读全文