给定一棵树,每次可以选一个叶子删掉。同时有 m m m 个限制 ( u , v ) (u,v) (u,v) 表示 u u u 必须在 v v v 之前删掉。求可能最后一个被删掉的点的集合。
如果有一个 u → v u\rightarrow v u→v 的限制,那么以 v v v 为根 u u u 的子树都不能选。之后把不能选的点之间定向,加上限制的边,如果有环就无解,否则可以证明解就是剩下的点。
给定一个字符串集合,求字符集大小为 k k k 且不包含任何一个集合中串的“双向无限”字符串个数。如果有无限个输出 -1。
k ≤ 10 , 总 串 长 ≤ 100000 k\leq 10,总串长\leq 100000 k≤10,总串长≤100000
构建出字符串和字符集的 AC 自动机。判断 inf:
1.某个 scc 不是简单环;
2.某条路径经过三个不同 scc。
否则,一条合法的路径一定是从一个环出发,走一些路径,再到一个环。
有一个 w × h w\times h w×h 的 01 01 01 矩阵 A A A,和一个 ( w − 1 ) ∗ ( h − 1 ) (w-1)*(h-1) (w−1)∗(h−1) 的矩阵 B B B,满足 B i , j = A i , j + A i , j + 1 + A i + 1 , j + A i + 1 , j + 1 B_{i,j}=A_{i,j}+A_{i,j+1}+A_{i+1,j}+A_{i+1,j+1} Bi,j=Ai,j+Ai,j+1+Ai+1,j+Ai+1,j+1
给你矩阵 B B B,请给出一个满足条件的矩阵 A A A。
添加辅助变量,每四个格子添加辅助变量表示哪些等于 0 0 0 ???
发现确定了第一行第一列和 A 11 A_{11} A11 之后,每个格子都可以由一坨 B B B 元素和两个 A A A 元素(该行第一个和该列第一个)算出。然后就是 2-sat 模型了。
田字格限制问题一般想一想确定了哪些东西以后解就是固定的了。
一棵树 m m m 对点,每次可以花费 1 1 1 的代价给一条边标记或者给一对点标记。满足每对未标记点的路径上的所有边都被标记。
n , m ≤ 10000 n,m\leq 10000 n,m≤10000
要么点对被覆盖,要么之间所有边被覆盖。建二分图,左边是点对,右边是边,每个点对向它们之间所有的边。求最小割即可。向树上的一条路径连边,可以倍增或者树剖优化。
给定一个由单位正方体组成的物体的俯视图,求最多拿掉多少正方体使得三视图不变。
n , m < = 100 n,m<=100 n,m<=100
首先满足俯视图。即俯视图不为零的都铺上一层。
答案的上界显然是每列最大值之和+每行最大值之和。什么时候答案会减小?就是行行和列公用最大值的时候。因此建立二分图,左边是行,右边是列,如果某行某列最大值相同并且这个格子可以放东西,就连流量 1 费用 最大值的边。跑最大费用流即可。
进一步观察发现权值相同的点才会联通,因此把权值相同的点拿出来跑最大流即可。
输赢分配问题
区间 k k k 覆盖问题
有一些区间,选择一个区间会产生一些收益。每个点覆盖它的区间最多不超过 k k k 个。
对于一个区间 [ l , r ] [l,r] [l,r],我们连边 l → r + 1 l\rightarrow r+1 l→r+1,流量 1 1 1,费用 k k k。求流量为 k k k 的最大费用流
答案的上界显然是不对移动进行限制的匹配。
考虑去调整匹配(变得合法)。如果匹配中士兵移动以后炸掉一个炮楼,然而不合法,那么他不移动的时候一定也可以炸掉一个炮楼。我们对他的匹配进行调整,匹配数不变。
非常有趣的调整。证明了上界总是可以达到的。
这一类网络流问题总是先去考虑答案的上界,然后用最小割/最大流来调整,或是直接证明了上界可以达到。
边权小的时候用桶代替dij的堆。
k短路 可并堆
多sat(每个变量出现两次,一正一反)。包含a的子句和-a的子句连无相边 cf
完全图最小生成树:曼哈顿最小生成树:把平面分成八个方向,向每个方向曼哈顿最近的点连边。每个区域有两条限制,比如x>=x0,(y-y0)-(x-x0)>=0,一维排序扫描线,另一维按区域维护x+y最小值即可。
编号gcd:只有向他的倍数的点的连边才有用。
xor:boruvka?
最小生成环套树。直接kruskal。正确性:未选择的边一定不在答案内。
次小生成树:枚举非树边,删掉路径最大边。
给定每个点的度数,构造满足条件的图或树
1.要求没有重边:
每次选一个度最大的点,假设度数为 k k k,和度数前 k k k 大的点连边。
2.不要求:
充要条件是最大点度数小于等于总度数的一半并且总度数为偶数。构造方法是每次选择两个度最大的点连边。
3.不要求没有重边要求联通。
树:
合法当且仅当和为 2 n − 2 2n-2 2n−2,且每个点至少是 1 1 1。
使用 prufer 序列,先提出叶子,和度数最大的点连边。维护两个集合,一个是叶子一个是非叶子。
prufer 序列:找到编号最小的叶子删掉,把邻接点放到序列里。直到剩两个点。每个点出现次数是 d − 1 d-1 d−1 次。
线性代数黑科技:
无向图的 dfs 树上给每个非树边分配一个随机整数权值,树边权值等于覆盖他的非树边权值的异或,一组边集是割集当且仅当对应权值线性相关。
割集只删掉这组边以后联通块数量增加了。线性相关指存在一个子集异或为 0 0 0。
dzyloves chinese。
支配树
DAG 上的做法较简单,一个点的支配点就是入边支配点的 Lca。