图论杂题
矩阵游戏
https://www.lydsy.com/JudgeOnline/problem.php?id=1059
刚开始以为只要每行每列都存在一个1,就是可行的解,
然后发现可以被yxm简单的数据hack掉:
1 1 1 1
0 0 0 1
0 0 0 1
0 0 0 1
正解是二分图。
行和列是互相区分的两组节点,
如果存在一个1,则可以在它的行列之间连边,
如果最大匹配数为n,该图就存在可行解。
容易想到同一行列上的1的数量一定不会变化,
因为要求在对角线,如果一个1被使用了,它所在的行列就不能再交换到存在1的位置,这些1就废掉了,
所以使用二分图是可行的。
天天爱跑步
https://loj.ac/problem/2359
这道题刚开始没有一点思路,只会打45分的暴力。
虽然知道是树上差分,但是想不到维护什么东西。
xuefeng提示了我一下,让我想到了维护一个不变的量,通过变量在已有信息中去寻找这个不变量。
一个点对的路径是$x->lca->y$,设d为深度,len为点对距离,w(a)为a点观察的时间。
在$x->lca$路径段,点a能观察到当且仅当$w(a)=d(x)-d(a) \Leftrightarrow w(a)+d(a)=d(x)$,
在$lca->y$路径段,点a能观察到当且仅当$w(a)=len-(d(y)-d(a)) \Leftrightarrow w(a)-d(a)=d(x)-2*d(lca)$。
分别维护等号右侧的两个不变量即可。
这个题让我想到了雨天的尾巴,在那道题中要求维护的是区间的最大值,
使用的维护的方法是合并线段树,但是在这题中复杂度可能会很高。
这道题让我们维护的是一个单点的值,并且满足这个值的可减性。
只要维护一个全局数组,在dfs进入时记录下当前的值,递归结束后统计下当前的值,后者减前者就是它的子树对它的贡献。
Journeys
bzoj权限题
关于区间建边:
$O(n^2m)$的暴力不提,一种$O(nm)$的方法是:
对于每个区间边,新建一个节点,将区间a每个点与该节点建立权值为0的单向边,将该节点与区间b每个点建立权值为1的单向边,
就达到了我们的要求。
更优秀的,一种$O(mlogn^2)$的方法是:
建立两棵线段树,分别为入边线段树和出边线段树。
我们把每个节点放到两棵线段树上,让他们作为线段树的叶子节点,
于是我们可以支持一个区间向另一个区间建边。
结合两种方法,可以得到$O(mlogn)$的方法。
Tree
https://www.lydsy.com/JudgeOnline/problem.php?id=2654
wqs二分
给每条白边附加一个权值,二分这个权值的大小。
显然对于附加权值的改变,得到的最小生成树中选择的白边数是单调的。
当我们恰好得到要求白边数量,我们就得到了一个最有解。
但对于很多条权值一样的情况,我们不能得到恰好为k的情况。
分析一下题目中的要求,我们在大于k的时候更新答案即可。