图论杂题

矩阵游戏

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的时候更新答案即可。

posted @ 2019-07-16 07:25  skyh  阅读(186)  评论(0编辑  收藏  举报